【发布时间】: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 列)将对应于数据库列名称
-
您是否考虑过用户选择将文本数据插入整数列的情况?还是您对所有列都使用字符类型?