【问题标题】:Read Excel using OLEDB with Cell Format使用单元格格式的 OLEDB 读取 Excel
【发布时间】:2015-07-16 08:42:52
【问题描述】:

我正在使用 C# 中的 ADO DB 读取 excel 表,但我面临的问题是它无法复制其格式的单元格数据。例如

我的一个单元格是货币格式 ($2,123.45),所以当我得到结果集时,我得到的单元格值为 (2123.45)。

有什么方法可以让我获得与 Excel 表中显示的完全相同的单元格数据。下面是我从 excel 中获取结果集的代码

        string sQuery = "Select * From [" + sSheet + "$]";

        if (dtType == DataLayer.TestData)
            sWorkbook = Path.GetDirectoryName(ConfigurationManager.AppSettings["resourcesFolder"]) + @"\Data\Test Data\" + sWorkbook;

        if (dtType == DataLayer.ExpectedData)
            sWorkbook = Path.GetDirectoryName(ConfigurationManager.AppSettings["resourcesFolder"]) + @"\Data\Expected Data\" + sWorkbook;

        string cnStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sWorkbook + "; Extended Properties= 'Excel 8.0; HDR=Yes; IMEX=1'";
        oConn.Open(cnStr, null, null, 0);
        oRS.Open(sQuery, cnStr, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic, -1);

        oConn.Close();

请提供一些解决方案。

注意:在最坏的情况下,如果我的表现不受影响,我可以选择其他选项来阅读 Excel。

【问题讨论】:

  • 您可以通过使用例如获得更好的性能。 EPPlus,excel文件的读写非常简单。
  • 我认为无法通过 Jet OLEDB 读取格式化值...您可以只读取数据,显然是 2123.45)。格式化是在 Excel 应用程序级别完成的......您可以使用 Excel 自动化或 OpenXML SDK 来读取内容和样式......
  • @PeterSchneider 在 EPPlus 我不认为(不太确定)我们可以选择一次性读取整个 excel 并将其保存在内存中,然后根据需要提取数据。
  • 是的,有可能...见here...

标签: c# excel oledb adodb


【解决方案1】:

这可能是问题所在:通过ConnectionStrings:查看位于注册表 REG_DWORD "TypeGuessRows" 的 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]。这是不让 Excel 仅使用前 8 行来猜测列数据类型的关键。将此值设置为 0 以扫描所有行。这可能会损害性能。另请注意,添加 IMEX=1 选项可能会导致 IMEX 功能仅在 8 行后设置。请改用 IMEX=0 以确保强制注册表 TypeGuessRows=0(扫描所有行)工作。

【讨论】:

  • 我认为问题不在于数据类型,Piyush 正在将数据读取为数字,问题是要检索显示的数字的 格式通过 Excel。 IMEX 设置对此没有影响。
  • 看来没有人能解决我的问题。请给任何重要的人提供解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
相关资源
最近更新 更多