使用两个DataAdapter使用OleDbConnection Excel到DataGridView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用两个DataAdapter使用OleDbConnection Excel到DataGridView相关的知识,希望对你有一定的参考价值。

1-将C:\ Book1.xlsx文件创建到C盘。

2-确保在名为Sheet1的C:\ Book1.xlsx文件中有一个工作表。

3-用一些数据填充从A1细胞到E20细胞的Sheet1细胞。

4-关闭C:\ Book1.xlsx文件。

5-将一个DataGridView放入Form1并将其命名为DataGridView1。

6-运行代码以查看是否能够正确地将Excel数据传输到DataGridView。

如您所见,我使用了两个OleDbDataAdapter,以便将Excel数据传输到DataGridView。

我更喜欢使用两个OleDbDataAdapter,因为如果excel数据如此之大,我会遇到内存不足的问题。

如果检查我的代码,您将看到myDataAdapter1从A1单元格到E10单元格获得excel数据。和myDataAdapter2应该从A11单元格到E20单元格获得excel数据。

如果您检查我的代码,您将看到我尝试合并两个DataTable并绑定到DataGridView1.DataSource但没有成功。

请更正我的代码并告诉我如何合并两个DataTables并绑定到DataGridView1.DataSource?

我想从A1单元格到E20单元格获取excel数据,并使用两个DataAdapter和两个DataTables放置DataGridView1。

如果我使用一个数据适配器,那么我的应用程序会崩溃大数据。

所以我尝试使用两个数据适配器和两个数据表。

答案

网格必须首先添加列以容纳数据。然后在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
另一答案

没有主键,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
另一答案

您可以从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

以上是关于使用两个DataAdapter使用OleDbConnection Excel到DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表

使用 Dataadapter 更新时发生 DBConcurrency 异常

DataAdapter.Fill()分页

不带 AMD 的 Select2 自定义 dataAdapter

如何使用 SqlCommand 和 DataAdapter 以使用 C# 操作 SQL Server

哪位高手简洁分析下ADO.NET中的常用对象:DataAdapter、Command、DataSet的使用情况。。非常感谢!!