乍一看,我遇到的问题和以前很多人一样,我发现很多关于我的问题的问题和答案,但没有一个能帮助我。
我使用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版本)下进行了测试,问题仍然存在。
我不知道我是否做错了什么但我花了很多时间仍然存在问题。
答案 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,那么这就是适用于我们的解决方案:
如果在执行导入的计算机上安装了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脚本处理之后)
如果没有Excel自动化服务器可用,那么我们使用 XLSX 作为数据格式和酷开源 ClosedXML 库读取数据。实际上,库更适合创建XLSX文件,但在这个问题中不需要它
Microsoft本身不建议使用旧版数据库驱动程序访问旧版Excel专有格式,主要是因为存在许多问题(例如,单元格数据格式模糊)。任何依赖Excel自动化的传统解决方案都不能保证在服务器场景下工作。
为了在生产中使用OpenXML SDK,您只需要部署单个DocumentFormat.OpenXml.dll并准备好读/写XLSX数据文件