Excel到DataTable导入错误的值

时间:2019-09-03 14:28:01

标签: mysql sql excel vb.net

我正在开发将excel导入mysql的程序。在应用程序中,用户首先必须加载一个excel文件,然后他将在DataGridView上看到该文件的加载。

问题在于,文件加载时会显示其他值,而不是excel值。

以下是excel文件中的一个示例,红色方块中的值为1,49 enter image description here 当Excel在DataTable> DataGridView中加载时,值为1,39 ... enter image description here

这是我将Excel加载到DataGridView的方法,该dataGridView称为MetroGrid1

Private Sub Upload_Click(sender As Object, e As EventArgs) Handles BtnUpload.Click
    Dim fd As OpenFileDialog = New OpenFileDialog()
    Dim strFileName As String

    fd.Title = "Seleziona file.."
    fd.InitialDirectory = "C:\"
    fd.Filter = "File Excel|*.xls;*.xlsx;*.xlsm"
    fd.FilterIndex = 2
    fd.RestoreDirectory = True

    If fd.ShowDialog() = DialogResult.OK Then
        strFileName = fd.FileName
        TxtUpload.Text = ""
        TxtUpload.Text = strFileName

        Dim dt As New DataTable
        Try


            Dim constring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            Dim con As New OleDbConnection(constring & "")

            con.Open()

            Dim myTableName = con.GetSchema("Tables").Rows(0)("TABLE_NAME")


            Dim sqlquery As String = String.Format("SELECT * FROM [{0}]", myTableName)
            Dim da As New OleDbDataAdapter(sqlquery, con)
            da.Fill(dt)


            MetroGrid1.DataSource = dt
            For Each c As DataGridViewColumn In MetroGrid1.Columns
                c.ReadOnly = True
                c.SortMode = DataGridViewColumnSortMode.NotSortable
            Next
            PictureBox1.Visible = False


            con.Close()
        Catch ex As Exception
            MsgBox(Err.Description, MsgBoxStyle.Critical)
        End Try
    End If


End Sub

实际上,我认为该值是错误的,因为在Excel 1,49中是从公式= D2 *(1-0,01 * E2)*(1-0,01 * F2)* 2,44获得的问题如下,我该如何导入正确的值?

更新: 实际上,我已经发现了问题,客户端excel文件中的数据被格式化为0,09,因此1,39的值变为1,49,因此该值是正确的。

更新2 通过设置IMEX = 1和HDR = NO,我得到了正确的值,但是我仍然需要标题。

1 个答案:

答案 0 :(得分:1)

问题在于excel中的值已格式化,因此它们不是数字。

解决方案是在OLEDB的连接字符串中将HDR设置为NO,将IMEX设置为1

无论如何我还是需要excel的标头,所以我在加载DataGridView源之前通过操作数据表来完成以下操作

            Dim i As Integer = 0
            For Each col As DataColumn In dt.Columns
                col.ColumnName = dt.Rows(0)(i).ToString
                i += 1
            Next
            dt.Rows.Remove(dt.Rows(0))

            MetroGrid1.DataSource = dt