无法打开.xlsx文件。

4

我想打开一个xlsx文件,我尝试了下面的代码,但它既不能打开也没有抛出任何错误。

有人能帮忙解决一下吗?

string path = "C:\\examples\\file1.xlsx";
string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";");
OleDbConnection cn = new OleDbConnection(connString);
cn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", cn);
DataTable dt = new DataTable();
adapter.Fill(dt);

“not open”是什么意思?你没有打开任何东西,你正在运行一个查询。语法没问题,缺少异常说明dt要么填充了行,要么工作表为空。添加Console.WriteLine(dt.Rows.Count)进行基本检查。 - Hans Passant
我建议您直接尝试SELECT表达式并查看返回结果,然后再填充DT。如果查询出错,请将其添加到此处的问题中。如果没有出错并且显示成功,则Hans的说法是正确的,即您的工作表为空。 - Phillip
4个回答

6

在2010年12月,微软(终于!)发布了一个64位的OLEDB驱动程序,用于CSV和XLSX文件。

您需要64位的Microsoft Access Database Engine 2010 Redistributable。确保下载64位版本(AccessDatabaseEngine_X64.exe)。您需要卸载任何32位Office应用程序(包括Sharepoint Designer!)才能安装它。

如果您想要CSV,则需要使用Microsoft Access Text Driver(*.txt, *.csv)驱动程序名称,但我还没有找到使用此驱动程序从OLEDB获取完整连接字符串的方法(如果您有,请留言,我会修改此答案)。注意,64位名称与32位版本不同。

要读取XLSX文件,请使用以下连接字符串:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
 + FilePath
 + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";

对于XLS(2007年之前的Excel)文件,请使用以下连接字符串:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
 + FilePath
 + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";

非常感谢这篇博客文章这个答案,在我遇到同样的问题时给了我正确的方向,并提供了内容,我改编后写下了这个答案。


1

查看此代码在您的连接字符串中的作用:

Extended Properties=\"Excel 8.0;HDR=YES;\",我相信您的其余连接字符串是正确的。


1

你是在64位的Windows上运行吗?我上次检查时,Excel工作簿的OLE驱动程序与64位的Windows不兼容。

.NET下的SpreadsheetGear可以让你从.NET中读取Excel工作簿,并且支持.NET 2.0+ - 包括64位的Windows。

你可以在这里看到实时示例here并下载免费试用版here

免责声明:我拥有SpreadsheetGear LLC。


Joe,你说得完全正确。 就是这样。 因为它在我办公室的32位Windows上运行良好,而在我家的64位系统上则不行。 谢谢Joe。 - cmrhema

0
除了Phillip的回答外,还要确保将TargetPlatform设置为x86。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接