【问题标题】:Excel data extraction - Issue with column data typeExcel 数据提取 - 列数据类型问题
【发布时间】:2023-03-19 22:23:01
【问题描述】:

我正在编写一个 C# 库来读取 Excel 文件(xls 和 xlsx),但遇到了一个问题。

this question 中表达的内容完全相同,如果我的 Excel 文件有一个包含字符串值的列,但第一行有一个数值,则 OLEDB 提供程序假定该列是数字并返回 @987654324 @ 表示该列中的非数字值。

我知道,作为in the answer provided,我可以在注册表中进行更改,但由于这是一个我计划在许多机器上使用的库并且不想更改每个用户的注册表值,所以我想知道如果有更好的解决方案。

可能是 ACE.OLEDB 以外的数据库提供程序(似乎 JET 不再得到足够好的支持而无法考虑)?

另外,由于这需要在 XLS / XLSX 上工作,EPPlus / XML 阅读器等选项不适用于 xls 版本。

【问题讨论】:

  • 我目前解决这个问题的方法是使用 Excel COM 接口和一些 C#,在 Excel 中打开文件并将其重新保存为 .csv 文件。我还有一个宏,它已加载并运行以整理内容,但这种方式删除了所有格式并允许更轻松地导入。
  • 谢谢,@AeroX,我正在考虑这个问题,但如果可能的话,我会尽量避免使用 Interop,因为这会打开其他几十个蠕虫罐 :) ...我希望其他人有另一种解决方案,但非常感谢您分享您的方法!
  • 改用 OpenXml Sdk。
  • @andrei.ciprian,有问题只在 xlsx 上工作,而不是 xls,不是吗?

标签: c# excel oledb import-from-excel


【解决方案1】:

你的连接字符串应该是这样的

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcelfile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

连接字符串中的 IMEX=1 是您需要将列视为混合数据类型的部分。这应该可以正常工作,无需编辑注册表。

HDR=Yes 只是将第一行标记为列标题,在您的特定问题中不需要,但无论如何我已经包含了它。

始终使用 IMEX=1 是检索混合数据列数据的一种更安全的方法。

来源:https://www.connectionstrings.com/excel/

编辑:

这是我正在使用的数据:

这是输出:

这是我使用的确切代码:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1""";

using (DbClass db = new DbClass(connString))
{
    var x = db.dataReader("SELECT * FROM [Sheet1$]");
    while (x.Read())
    {
        for (int i = 0; i < x.FieldCount; i++)
            Console.Write(x[i] + "\t");
        Console.WriteLine("");
    }
}

DbClass 是我为了让生活更轻松而制作的一个简单包装器。可以在这里找到:

http://tech.reboot.pro/showthread.php?tid=4713

【讨论】:

  • 仅供参考,可悲的是,Kobe,我在网上找到了这个,这似乎很有意义:set "IMEX=1" in the Extended Properties section of the connection string. This enforces the ImportMixedTypes=Text registry setting. You can change the enforcement of type by changing [HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTypes] to numeric as well. - 基本上 IMEX=1 加强了注册表设置,但本身并不够好。
  • 我添加了我用来测试的确切代码。你能提供一个链接到你在哪里找到的吗?另外,对于 JET 或 ACE,我没有这些注册表设置。所以,我不明白怎么会这样。
  • 它不在 MSDN 或其他任何东西上,但它似乎验证了我所看到的是真实的 - codeproject.com/Articles/37055/… - 大约在页面下方的 1/4 处......
  • 再次更新帖子。我确定。我检查了 Wow6432Node。你在看什么路径?你是 x64 还是 x86?
  • 哈,电脑疯了。您可能没有做错任何事情,也可能存在一些疯狂的问题导致您的计算机无法工作,或者我的计算机在没有密钥的情况下运行。无论如何,我希望你想出一个解决方案。也许将 Excel 自动化 dll 拉入您的项目并沿着这条路走下去。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多