使用 OLEDB 数据提供程序读取 excel 文件
Posted
技术标签:
【中文标题】使用 OLEDB 数据提供程序读取 excel 文件【英文标题】:Reading excel file using OLEDB Data Provider 【发布时间】:2013-08-29 12:53:03 【问题描述】:我正在使用 OLEDB Data Provider 来读取 excel 文件,但问题是在 excel 表中某些 cloumn 具有无效值,例如,而不是数字字符串, 当我读取这个无效值时,我得到一个空字符串而不是实际值。
对于上面的截图,当我读取值 john 得到空字符串时。
那么有什么方法可以读取这个无效值吗?
任何帮助将不胜感激。
代码是读取excel文件
private DataTable ReadExcelFile(string sheetName, string path)
using (OleDbConnection conn = new OleDbConnection())
DataTable dt = new DataTable();
string Import_FileName = path;
string fileExtension = Path.GetExtension(Import_FileName);
if (fileExtension == ".xls")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;'";
if (fileExtension == ".xlsx")
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Import_FileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'";
using (OleDbCommand comm = new OleDbCommand())
comm.CommandText = "Select * from [" + sheetName + "$]";
comm.Connection = conn;
using (OleDbDataAdapter da = new OleDbDataAdapter())
da.SelectCommand = comm;
da.Fill(dt);
return dt;
【问题讨论】:
【参考方案1】:这对我有用
using (OleDbConnection conn = new OleDbConnection())
DataTable dt = new DataTable();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
+ ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;MAXSCANROWS=0'";
using (OleDbCommand comm = new OleDbCommand())
comm.CommandText = "Select * from [" + sheetName + "$]";
comm.Connection = conn;
using (OleDbDataAdapter da = new OleDbDataAdapter())
da.SelectCommand = comm;
da.Fill(dt);
return dt;
MAXSCANROWS=0 覆盖注册表默认值并在确定类型之前扫描所有行。 IMEX=1 仍然需要包含在内。
例如,给定这张表:
Header | Header
------ | ------
Cell1 | 2456354
Cell2 | 2456354
Cell3 | 2456354
Cell4 | 2456354
Cell5 | 2456354
Cell6 | 2456354
Cell7 | 2456354
Cell8 | 2456354
Cell9 | A5341
以下连接字符串将丢失 A5341
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
+ ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1;'"
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path
+ ";Extended Properties='Excel 12.0 Xml;HDR=YES;MAXSCANROWS=0'"
但当两者兼有时,它会起作用。
【讨论】:
【参考方案2】:您需要将TypeGuessRows
注册表项的值设置为0,这样驱动程序将根据所有列值而不是前8个(默认)设置数据类型。
密钥的位置因驱动程序版本而异,您可以根据您的特定版本轻松谷歌它。例如,对于 Access Connectivity Engine 2007,它将是
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel
顺便说一句,您不需要 Jet 来读取 XLS 文件,ACE 也完全可以做到这一点。
【讨论】:
我认为你可以通过在HDR=YES
之后的连接字符串中设置;IMEX=1"
来完成同样的事情。
@DougGlancy 我记得这种方法存在问题,但绝对值得一试,如果可行,它比注册表编辑更好。
IMEX=1 不影响这一点。看到这个话题***.com/questions/10102149/…以上是关于使用 OLEDB 数据提供程序读取 excel 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 OleDB 读取 Excel 文件返回格式错误的 UPC 编号
Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册“如果导入 (.xlsb) Excel 二进制格式文件