ado net – 导入excel数据 – 缺less数据

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

我使用ADO NET在NET中执行从MS Excel文件(文件XLS)导入。 该文件包含在同一列中的混合types:数字和文本,以及众所周知的问题 – 文本格式不被识别,数据丢失。

我使用以下连接string与推荐的参数:

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和ASPnetworking版testing)下testing,问题依然存在。

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

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

图书馆: 链接到项目

您需要将一些密钥添加到Windowsregistry, 他们将强制Excel引擎将al列作为文本

将下面的代码保存在ForceExcelImportAsText.reg文件中,然后双击它,将这些密钥添加到Windowsregistry中。

 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 CLOSED

我从来不明白为什么,但如果打开Excel和/或如果我正在导入的文件打开,然后Excel引擎搞乱数字/数据列,然后你会得到的是没有意义的数字,而不是你的数据。

关于连接string
我使用的连接string是

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

对于直到Excel 2003的.xls文件,参数“ Excel 8.0 ”正常。
对于Excel 2007-2013 .xlsx文件,我使用“ Excel 12.0 Xml
对于Excel 2007-2013 .xlsb文件,我使用“ Excel 12.0
对于Excel 2007-2013 .xlsm文件,我使用“ Excel 12.0macros

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

如果最初的目标是导入数据,而不是使用ado.net,那么这是适合我们的解决scheme:

  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库来读取数据。 实际上,图书馆在创buildXLSX文件方面比较好,但在这个问题上并不需要

微软本身不build议使用遗留数据库驱动程序访问传统的Excel专有格式,主要是因为这些问题(如单元格数据格式不明确)。 而任何依靠Excel自动化的传统解决scheme都不能保证在服务器上的情况下工作。

为了在生产环境中使用OpenXML SDK ,您只需要部署一个DocumentFormat.OpenXml.dll,然后就可以读取/写入XLSX数据文件