【问题标题】:Import from excel to datatable skipping last column values从excel导入数据表跳过最后一列值
【发布时间】:2015-03-13 11:23:37
【问题描述】:

我正在尝试将数据从 excel 文件导入数据表。但问题是最后一列的值被跳过了。其余列的值是完美的。我的 excel 文件包含以下内容:

在数据表中导入数据后如下:

我的代码如下:

  Dim connExcel As New OleDbConnection(constr)
    Dim cmdExcel As New OleDbCommand()
    Dim oda As New OleDbDataAdapter()
    Dim dt As New DataTable()
    cmdExcel.Connection = connExcel

    'Read Data from First Sheet
    connExcel.Open()
    cmdExcel.CommandText = "SELECT * From [Sheet1$]"
    oda.SelectCommand = cmdExcel
    oda.Fill(dt)
    connExcel.Close()

连接字符串如下:

<add name="ExcelCon12" connectionString="Provider=Microsoft.JET.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0" />
<add name="ExcelCon4" connectionString="Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0"/>

我做错了什么?

【问题讨论】:

  • 在显示数据表时是否有任何可能出现错误?
  • 不,令我惊讶的是,如果我在此之后添加更多列,则填充的值没有任何问题。但是,如果我将 excel 文件中的这一列复制粘贴到任何其他列,则该列的问题仍然存在。然后,我创建了另一列,在其中插入了相同的值并删除了该列,之后,将新列重命名为 Credit。它意外地解决了。似乎问题本质上就在列中!!
  • @ubaidashrafmasoody 我在回答中提到它可能位于列本身内,但它也可能是我提到的其他内容......

标签: asp.net vb.net excel import datatable


【解决方案1】:

从您提供的代码的外观来看,我没有看到问题。我相信问题在于专栏本身。例如:混合值 (bg123 | 1234)。这个列可以混用吗?整数,字符串等? ADO.Net 根据列特别是从大多数值中选择 DataType。然后将每个单元格转换为 ADO.Net 选择的那种类型。如果你有更多的整数,它会被转换为数字,如果不是,它将被转换为字符串......

一种解决方案是在连接字符串中使用ExtendedProperties;表示您正在导入数据。

试试下面的方法...

 Extended Properties=""Excel8.0;IMEX=1""" 'This is to tell it to not care about the types...(mixed); be sure to include the `"` around the `ExtendedProperties` as well.

你的连接字符串现在...

 "Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;IMEX=1"""

【讨论】:

  • 令我惊讶的是,如果我在此之后添加更多列,则填充的值没有任何问题。但是,如果我将 excel 文件中的这一列复制粘贴到任何其他列,则该列的问题仍然存在。然后,我创建了另一列,在其中插入了相同的值并删除了该列,之后,将新列重命名为 Credit。它意外地解决了。似乎问题本质上是在列中!但究竟是什么问题?
  • @ubaidashrafmasoody 请阅读我的回答,因为它解释了这一点。它可能对将它们转换为什么类型感到困惑......如果有比整数(数字)更多的“空”或空值,它会将这些单元格转换为字符串,但如果您的类型是数字,则该列中的每个单元格都会失败。
  • @ubaidashrafmasoody 在您提供的屏幕截图中显示的正是如此;借方中的大多数列值都是整数,它将将该列数据类型转换为整数。另一方面,你的最后一列有更多的空值,它们会将它们转换为字符串,但你的数据由整数组成,但会失败,因为它不知道如何处理它们。
  • 我复制了单元格内容,确切地说,空单元格或非空单元格的数量保持不变。
【解决方案2】:

我赞同这确实是 Excel / OleDb 中的一个错误的想法。 @ubaidashrafmasoody 是正确的,我今天也重现了同样的行为。另一个提供的答案,它可以通过设置来修复

Extended Properties="Excel 8.0;IMEX=1"

似乎不正确,因为我在连接字符串中已经设置了此行为。

错误行为的细节是这样的(尽管有可能编辑:如果最后一列在前几行(大概 8 行)中有(大部分)空单元格,那么该列不会出现在任何 SQL 语句。(这会在某些编辑后任意修复,正如@ubaidashrafmasoody 所描述的那样。)例如,如果我有五列,Column1、Column2、Column3、Column4 和 Column5,其值(标题中的 Column5 除外)行)空白,然后:

SELECT * From [Sheet1$]

只会返回 4 列。

如果我只命名其中的四列,例如:

SELECT [Column1], [Column2], [Column3], [Column4] From [Sheet1$]

那么它将正确返回。但如果我命名第五列:

SELECT [Column1], [Column2], [Column3], [Column4], [Column5] From [Sheet1$]

然后它会出错并显示未指定 [Column5] 的参数值的消息。或者,没有括号,就没有这样的字段。

甚至在 SQL 语句中明确指定范围:

SELECT [Column1], [Column2], [Column3], [Column4], [Column5] From [Sheet1$A1:E55]

SELECT * From [Sheet1$A1:E55]

无法检索第五列。

但是,一个简单的“修复”方法是添加一个名为 e.g. 的新空白列。在此之后的第 6 列。突然,Column5 变得可见,尽管它是 NULL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多