【问题标题】:Importing from Excel - non-numeric values are ignored从 Excel 导入 - 忽略非数字值
【发布时间】:2009-09-19 12:14:24
【问题描述】:

我有从指定格式的 Excel 工作表导入的代码。在其中一列中,大多数数据是数字的,但也存在非数字值。由于某种原因,导入代码会忽略非数字值。

连接字符串如下所示:

    Dim FileConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & Path & "\" & _
    Filename & ";Extended Properties=" & _
    """Excel 12.0;HDR=YES;IMEX=1;"""

实际的导入代码如下所示:

    Dim Factory As DbProviderFactory = _
    DbProviderFactories.GetFactory("System.Data.OleDb")

    Dim Adapter As DbDataAdapter = Factory.CreateDataAdapter(), _
    DataObject As New DataSet

    Using Connection As DbConnection = Factory.CreateConnection
        Connection.ConnectionString = FileConnectionString

        Using Command As DbCommand = Connection.CreateCommand

            Command.CommandText = _
            "SELECT [Column1], [Column2]" & _
            "FROM [Sheet1$]"

            Adapter.SelectCommand = Command

            Adapter.Fill(DataObject)

            ...

请注意,我已启用 IMEX = 1 以通知 Excel 将出现混合数据。这似乎没有帮助。知道发生了什么吗?

【问题讨论】:

    标签: asp.net import-from-excel


    【解决方案1】:

    我注意到的是引擎从列中的第一个值推断列的数据类型。

    因此,如果您的第一个值是数字,引擎将假定该列为数字,并且尝试将 alpha 值转换为数字时会失败。

    我通常所做的是将下划线附加到 Excel 上的所有值,然后在 SQL 或 DataSet 上,以替换第一个下划线。希望对你有帮助

    【讨论】:

    • 谢谢,非常有用的提示 - 但就原因而言,杰夫的提示似乎更准确。我可能会在工作表中输入 8 个虚拟 STRING 值(以编程方式或手动方式)以获得最可预测、最便携的行为。
    • 哦,顺便说一句,我不能使用您的解决方案的原因是因为我不想为每个值添加下划线而产生开销。干杯。
    【解决方案2】:

    默认情况下,Excel 根据前 8 行数据确定列的数据类型。要更改这一点,您需要更新注册表项:

    HKLM\Software\Microsoft\Office\12.0\Access Connect Engine\Engines\Excel

    您希望 Excel 扫描的行数。将该值设置为 0 以使其扫描所有行。请注意,将其设置为零会稍微减慢 Excel 的加载速度,尤其是在大型电子表格上。

    此外,如果您还使用 Excel 2003,则需要更新第二个注册表项:

    HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

    【讨论】:

    • 谢谢 - 我确实可以访问服务器,所以我正在讨论编辑注册表。值,或者只输入 8 个虚拟字符串值。我认为后者会更便携。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多