1
Private Sub readexcel()
    Dim cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtFileName.Text & "; Extended Properties=Excel 12.0;")

    Dim oconn As New OleDbCommand("select * from [Sheet1$]", cnn)
    cnn.Open()
    Dim adp As New OleDbDataAdapter(oconn)
    Dim dt As New DataTable()
    Dim ds As DataSet
    adp.Fill (dt)

    dgvExcelData.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    dgvExcelData.EditMode = DataGridViewEditMode.EditProgrammatically
    dgvExcelData.DataSource = dt
End Sub

上面的代码将 Excel 读取到网格视图中,但是会丢失一些数据。有人能告诉我为什么吗?

在此处输入图像描述

4

1 回答 1

2

默认情况下,ACE 读取前 8 行数据并使用它来决定每列的数据类型。

如果一列中这 8 行中的数据属于同一类型,则假定该类型,否则默认情况下将假定为文本。在 8 列之后它不会检查它。

如果您的列具有混合数据类型,那么您将不得不在注册表中进行一些小的更改。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel

并将键的值TypeGuessRows从更改80

在此处输入图像描述

现在测试下面的代码

Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
    Dim strCon As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtFileName.Text &
                           "; Extended Properties=""Excel 12.0 XML;HDR=YES;IMEX=1;"""

    Dim cnn As New OleDbConnection(strCon)

    Dim oconn As New OleDbCommand("select * from [Sheet1$]", cnn)
    cnn.Open()

    Dim adp As New OleDbDataAdapter(oconn)
    Dim dt As New DataTable()
    adp.Fill(dt)

    dgvExcelData.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    dgvExcelData.EditMode = DataGridViewEditMode.EditProgrammatically
    dgvExcelData.DataSource = dt
End Sub

这是输出

在此处输入图像描述

于 2013-04-26T19:36:19.080 回答