【问题标题】:Excel to DataTable importing wrong valuesExcel 到 DataTable 导入错误的值
【发布时间】:2019-09-03 14:28:01
【问题描述】:

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

问题是当文件被加载时,它会显示其他值而不是 excel 值。

这是 excel 文件中的示例,红色方块中的值为 1,49 而当 Excel 在 DataTable > DataGridView 中加载时,它是 1,39...

这是我将 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 我得到了正确的值,但我仍然需要标题。

【问题讨论】:

  • 看起来像浮点转换问题。我相信 Excel 默认是浮动的。你可能想要十进制。在填充数据表之前尝试创建列(带有数据类型)。
  • @JacobH 实际上我无法定义数据表数据类型,因为每个加载的 excel 文件都会不同,因此列名将永远不同,甚至数据表中的数据也会不同..
  • 你可以试试this。我认为一个更大的问题是,如果您并不真正了解列或数据类型,您将如何将数据导入 MySQL。
  • @JacobH 实际上该部分尚未工作,加载 excel 文件后的用户将选择哪个 excel 列(DataGridView 列)将对应于数据库列名称
  • 您是否考虑过用户选择将文本数据插入整数列的情况?还是您对所有列都使用字符类型?

标签: mysql sql excel vb.net


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多