【问题标题】:ado net - import excel data - missing dataado net - 导入excel数据 - 缺少数据
【发布时间】:2014-03-15 08:16:01
【问题描述】:

乍一看,我遇到了很多人以前遇到的同样问题,我发现了很多关于我的问题的问题和答案,但没有一个对我有帮助。

我使用 ADO NET 从 NET 中的 MS excel 文件(文件 XLS)导入。该文件在同一列中包含混合类型:数字和文本,并且出现了众所周知的问题 - 无法识别文本格式并丢失数据。

我使用以下带有推荐参数的连接字符串:

string strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\";", pathname);

这是我的代码:

OleDbConnection sqlConn = new OleDbConnection(this.strConnectionString);

sqlConn.Open();

OleDbDataAdapter sqlAdapter = new OleDbDataAdapter();

string sql = "SELECT * FROM [" + sheetName + "]";

OleDbCommand selectCMD = new OleDbCommand(sql, sqlConn);

sqlAdapter.SelectCommand = selectCMD;

DataTable dt = new DataTable(sheetName);

sqlAdapter.Fill(dt);

我在NET 3.5(x86)和NET 4.0(x86)下测试过(也测试过windows exe和asp net版),问题依旧。

我不知道我是否做错了什么,但我花了很多时间,问题仍然存在。

【问题讨论】:

  • 看看This。我知道这有点乏味,但它会完成工作。
  • 谢谢@Rohan。我看到了这个答案,看起来我必须在 Excel 下手动添加第一个文本行,然后我可以通过 ADO NET 读取(并删除额外添加的行)。我想避免更改现有的 excel 文件,因为它是一个不适合我的用户的应用程序。如果可以通过 ADO NET 临时添加第一个文本行,然后保存 excel 文件,最后读取这个更改的 excel 文件,我会接受。

标签: .net excel ado.net dataset oledb


【解决方案1】:

最近我发现了开源(MIT 许可证)NET 库,它可以正确读取 xls 和 xlsx 文件。在这种情况下,我停止使用 oledb 驱动程序。

图书馆:link to project

【讨论】:

    【解决方案2】:

    您需要在 Windows 注册表中添加一些键,它们会强制 Excel 引擎将所有列视为文本

    将以下代码保存在 ForceExcelImportAsText.reg 文件中,然后双击它,将密钥添加到 Windows 注册表。

    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel]
    "TypeGuessRows"=dword:00000000
    
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
    "TypeGuessRows"=dword:00000000
    

    另外,请记住在导入文件时保持 Excel 关闭

    我一直不明白为什么,但是如果打开 Excel 和/或打开我要导入的文件,则 Excel 引擎会弄乱数字/数据列,然后您将得到的只是无意义的数字,而不是您的数据。

    关于连接字符串
    我使用的连接字符串是

    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\YourExcelFile.xls;Extended Properties="Excel 8.0;HDR=YES;IMEX=1"
    

    Excel 8.0”参数适用于 .xls 文件(直到 Excel 2003)。
    对于 Excel 2007-2013 .xlsx 文件,我使用“Excel 12.0 Xml
    对于 Excel 2007-2013 .xlsb 文件,我使用“Excel 12.0
    对于 Excel 2007-2013 .xlsm 文件,我使用“Excel 12.0 Macro

    此外,数据提供程序“Microsoft.Jet.OLEDB.4.0”适用于 .xls Excel 2003 文件。
    对于 Excel 2007-2013 xlsx/xlsb/xlsm 文件,您需要使用“Microsoft.ACE.OLEDB.12.0”数据提供程序。

    【讨论】:

    • 我在 Web 应用程序中使用它,因此无法更改注册表,因为它托管在第三方机器上(服务器托管)。
    • 您可能应该在该连接字符串中包含“IMEX=1”。
    • @Buggieboy 谢谢,我修复了它(我发誓它就在那里,在我用作模板的原始连接字符串上......但它在过程中的某个地方丢失了:-))
    【解决方案3】:

    如果最初的目标是导入数据而不是不惜一切代价使用 ado.net,那么这就是适合我们的解决方案:

    1. 如果在进行导入的机器上安装了 Excel,我们会运行小的不可见 自动化脚本,Excel 通过该脚本将原始数据文件转换为可读的文件。在我们的例子中进入 xml。这就是 Xls2Xml.vbs 文件的样子 ' VB Script Document if WScript.Arguments.Count < 2 Then WScript.Echo "Error! Please specify the source path and the destination. Usage: Xls2Xml SourcePath.xls Destination.xml" Wscript.Quit End If Dim oExcel Set oExcel = CreateObject("Excel.Application") Dim oBook Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0)) oBook.SaveAs WScript.Arguments.Item(1), 46 oBook.Close False oExcel.Quit Wscript.Quit 46 个幻数表示xlXMLSpreadsheet。 当脚本完成后,我们会导入可读的 XML 格式(通常在通过客户特定的 XSLT 脚本处理之后)

    2. 如果没有可用的 Excel 自动化服务器,那么我们使用 XLSX 作为数据格式和酷炫的开源 ClosedXML 库来读取数据。实际上该库更擅长创建 XLSX 文件,但在这个问题中不需要它

    Microsoft 本身不建议使用旧版数据库驱动程序访问旧版 Excel 专有格式,主要是因为存在许多问题(例如单元格数据格式不明确)。而且,任何依赖 Excel 自动化的旧式解决方案都不能保证在服务器端场景中正常工作。

    为了在生产中使用OpenXML SDK,您只需要部署单个 DocumentFormat.OpenXml.dll 并准备好读取/写入 XLSX 数据文件

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 2017-03-23
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多