Excel 使用两个 DataAdapter 到带有 OleDbConnection 的 DataGridView
Excel to DataGridView with OleDbConnection using two DataAdapter
1- 创建 C:\Book1.xlsx 文件到 C 磁盘。
2- 确保在 C:\Book1.xlsx 文件中有一个 sheet 名为 Sheet1 .
3- 用一些数据填充从 A1 单元格到 E20 单元格的 Sheet1 单元格。
4- 关闭 C:\Book1.xlsx 文件。
5- 将一个DataGridView放入Form1中,命名为DataGridView1.
6- 运行 代码,以查看您是否能够将 excel 数据正确地获取到 DataGridView。
如您所见,我使用了两个 OleDbDataAdapters 来获取 excel 数据到 DataGridView.
我更喜欢使用两个 OleDbDataAdapters,因为如果 excel 数据太大,我会遇到 内存不足异常 .
如果您检查我的代码,您会看到 myDataAdapter1 从 A1 单元格获取 excel 数据到 E10 单元格。
myDataAdapter2 应该从 A11 单元格获取 excel 数据到 E20 单元格。
如果您检查我的代码,您会发现我试图合并两个 DataTables 并绑定到 DataGridView1.DataSource成功。
请更正我的代码并告诉我如何合并两个 DataTables 并绑定到 DataGridView1.DataSource?
我想从 A1 单元格获取 excel 数据到 E20 单元格,并使用两个 DataAdapter 和两个 DataTables 放置 DataGridView1。
如果我使用一个数据适配器,那么我的应用程序会因大数据而崩溃。
所以我尝试使用两个数据适配器和两个数据表。
DataTable.Merge
没有主键就无法工作。我用 DataTable.Load(IDataReader)
搞混了,但那必须在下面使用 Merge 。因此,您可以将主键添加到 Excel 工作表(只是一种行号列)并在代码中设置适当的属性,或者手动循环遍历第二个 DataTable,将记录添加到网格中。 (慢)
这里是用所有数据填充网格的一种稍微不同的方法。我没有要测试的大型 Excel 工作表。它可能会解决内存问题,但恐怕它会在下面使用相同的方法。
Private Sub FillFromExcel()
Dim FileName As String = "Book1.xlsx" '"C:\Book1.xlsx"
Dim dt As New DataTable
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & FILENAME & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";")
Using cmd As New OleDbCommand("SELECT * FROM [Sheet1$];", cn)
cn.Open()
dt.Load(cmd.ExecuteReader)
End Using
End Using
DataGridView1.DataSource = dt
End Sub
网格必须先添加列以容纳数据。然后在 While 循环中添加行。我在 Excel.
的测试数据中只有 3 列
Private Sub PrepareGrid()
DataGridView1.Columns.Add("col1", "Column 1")
DataGridView1.Columns.Add("col2", "Column 2")
DataGridView1.Columns.Add("col3", "Column 3")
End Sub
Private Sub FillFromExcel()
Dim FileName As String = "Book1.xlsx" '"C:\Book1.xlsx"
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & FileName & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";")
Using cmd As New OleDbCommand("SELECT * FROM [Sheet1$];", cn)
cn.Open()
Using reader = cmd.ExecuteReader
While reader.Read
DataGridView1.Rows.Add(reader(0), reader(1), reader(2))
End While
End Using
End Using
End Using
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrepareGrid()
FillFromExcel()
End Sub
您可以从 Excel 文件转到 DGV,就像这样。
Imports System.Data.SqlClient
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim DtSet As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\vb.net-informations.xls';Extended Properties=Excel 8.0;")
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
MyCommand.TableMappings.Add("Table", "Net-informations.com")
DtSet = New System.Data.DataSet
MyCommand.Fill(DtSet)
DataGridView1.DataSource = DtSet.Tables(0)
MyConnection.Close()
End Sub
End Class
1- 创建 C:\Book1.xlsx 文件到 C 磁盘。
2- 确保在 C:\Book1.xlsx 文件中有一个 sheet 名为 Sheet1 .
3- 用一些数据填充从 A1 单元格到 E20 单元格的 Sheet1 单元格。
4- 关闭 C:\Book1.xlsx 文件。
5- 将一个DataGridView放入Form1中,命名为DataGridView1.
6- 运行 代码,以查看您是否能够将 excel 数据正确地获取到 DataGridView。
如您所见,我使用了两个 OleDbDataAdapters 来获取 excel 数据到 DataGridView.
我更喜欢使用两个 OleDbDataAdapters,因为如果 excel 数据太大,我会遇到 内存不足异常 .
如果您检查我的代码,您会看到 myDataAdapter1 从 A1 单元格获取 excel 数据到 E10 单元格。 myDataAdapter2 应该从 A11 单元格获取 excel 数据到 E20 单元格。
如果您检查我的代码,您会发现我试图合并两个 DataTables 并绑定到 DataGridView1.DataSource成功。
请更正我的代码并告诉我如何合并两个 DataTables 并绑定到 DataGridView1.DataSource?
我想从 A1 单元格获取 excel 数据到 E20 单元格,并使用两个 DataAdapter 和两个 DataTables 放置 DataGridView1。
如果我使用一个数据适配器,那么我的应用程序会因大数据而崩溃。
所以我尝试使用两个数据适配器和两个数据表。
DataTable.Merge
没有主键就无法工作。我用 DataTable.Load(IDataReader)
搞混了,但那必须在下面使用 Merge 。因此,您可以将主键添加到 Excel 工作表(只是一种行号列)并在代码中设置适当的属性,或者手动循环遍历第二个 DataTable,将记录添加到网格中。 (慢)
这里是用所有数据填充网格的一种稍微不同的方法。我没有要测试的大型 Excel 工作表。它可能会解决内存问题,但恐怕它会在下面使用相同的方法。
Private Sub FillFromExcel()
Dim FileName As String = "Book1.xlsx" '"C:\Book1.xlsx"
Dim dt As New DataTable
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & FILENAME & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";")
Using cmd As New OleDbCommand("SELECT * FROM [Sheet1$];", cn)
cn.Open()
dt.Load(cmd.ExecuteReader)
End Using
End Using
DataGridView1.DataSource = dt
End Sub
网格必须先添加列以容纳数据。然后在 While 循环中添加行。我在 Excel.
的测试数据中只有 3 列Private Sub PrepareGrid()
DataGridView1.Columns.Add("col1", "Column 1")
DataGridView1.Columns.Add("col2", "Column 2")
DataGridView1.Columns.Add("col3", "Column 3")
End Sub
Private Sub FillFromExcel()
Dim FileName As String = "Book1.xlsx" '"C:\Book1.xlsx"
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & FileName & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";")
Using cmd As New OleDbCommand("SELECT * FROM [Sheet1$];", cn)
cn.Open()
Using reader = cmd.ExecuteReader
While reader.Read
DataGridView1.Rows.Add(reader(0), reader(1), reader(2))
End While
End Using
End Using
End Using
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrepareGrid()
FillFromExcel()
End Sub
您可以从 Excel 文件转到 DGV,就像这样。
Imports System.Data.SqlClient
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim DtSet As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\vb.net-informations.xls';Extended Properties=Excel 8.0;")
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
MyCommand.TableMappings.Add("Table", "Net-informations.com")
DtSet = New System.Data.DataSet
MyCommand.Fill(DtSet)
DataGridView1.DataSource = DtSet.Tables(0)
MyConnection.Close()
End Sub
End Class