从Excel导入 - 非数字值将被忽略

4
我可以帮您翻译成中文。这段代码是用于导入指定格式的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存在混合数据。这似乎没有帮助。有什么想法?
2个回答

3
我注意到引擎从列中的第一个值推断出数据类型。因此,如果第一个值是数字,引擎将假定该列为数字,并在尝试将字母值转换为数字时失败。我通常会在Excel上附加下划线来处理所有值,然后在SQL或DataSet上进行替换以去掉第一个下划线。希望能有所帮助。

1
谢谢,非常有用的提示 - 但是Jeff的提示在原因方面似乎更准确。我可能会在表格中输入8个虚拟字符串值(通过编程或手动方式),以获得最可预测、最便携的行为。 - Donnie Thomas
哦,顺便说一下,我不能使用你的解决方案是因为我不想增加每个值的下划线开销。干杯。 - Donnie Thomas

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个虚拟字符串值。后者更具可移植性,我想。 - Donnie Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接