ado net - 导入excel数据 - 缺少数据

时间:2014-02-15 23:46:24

标签: .net excel ado.net dataset oledb

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

我使用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版本)下进行了测试,问题仍然存在。

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

3 个答案:

答案 0 :(得分:2)

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

图书馆:link to project

答案 1 :(得分:1)

您需要向Windows注册表添加一些密钥,它们将强制Excel引擎将al列视为文本

将以下代码保存在 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宏

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

答案 2 :(得分:0)

如果最初的目标是导入数据而不是不惜任何代价使用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文件,但在这个问题中不需要它

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

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