Excel“外部表格格式不符合预期。”

169

我正在尝试使用以下代码读取Excel(xlsx)文件。如果我没有在Excel中打开该文件,则会出现“外部表格格式不正确”的错误。换句话说,在我能够从C#程序中读取它之前,我必须先在Excel中打开该文件。xlsx文件位于我们网络共享上。如何在不先打开文件的情况下读取文件? 谢谢

string sql = "SELECT * FROM [Sheet1$]";
string excelConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathname + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";

using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, excelConnection)) {
    DataSet ds = new DataSet();
    adaptor.Fill(ds);
}

就我而言,我是在尝试使用当前ACE和建议的扩展属性打开Excel表格时收到了这个错误提示。当我手动打开文件时,它出现了一个提示,让我启用编辑权限。我需要找出如何自动翻转该位,但如果您也遇到此问题,您可能只需要打开该文件,然后启用编辑权限即可。我可以尝试查看一下能否以只读方式打开该文件,因为在本帖子的很远处我看到了有关此内容的信息。 - Jeff Patton
25个回答

1

ACE已经取代JET

Ace支持所有之前的Office版本

这段代码运行良好!

        OleDbConnection MyConnection;
        DataSet DtSet;
        OleDbDataAdapter MyCommand;
        
        MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\\Book.xlsx;Extended Properties=Excel 12.0;");
        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
        DtSet = new System.Data.DataSet();
        
        MyCommand.Fill(DtSet);
        dataGridView1.DataSource = DtSet.Tables[0];
        MyConnection.Close();

1
这并不是解决之道。问题仍然可能发生,我还没有找出原因,因为我的文件都来自 Excel 2007,有些可以工作,有些则无法工作。 - Henrik
你有这个声明的来源吗?我自己不知道,只是在想。 :-) - midoriha_senpai
很好,完美地与ACE一起工作,而不是JET。 - Susheel Kumar

1

我曾遇到这个问题,根据Marcus Miris的this帖子,将Extended Properties更改为HTML Import就解决了。

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"

你不知道我为此奋斗了多久,结果发现我们应用程序导出的XLSX文件只是重命名的HTML文件。谢谢! - Martin

1
遇到了同样的问题,找到了这个帖子。除了@Smith在2013年4月17日对被接受答案的评论之外,以上所有建议都没有帮助。
我的问题背景与@zhiyazw非常接近 - 基本上是尝试将导出的Excel文件(在我的情况下为SSRS)设置为dtsx包中的数据源。经过一些折腾后,我所做的就是重命名工作表。它不必像@Smith建议的那样小写。
我想ACE OLEDB期望Excel文件遵循某种XML结构,但某种方式上Reporting Services并不知道这一点。

我遇到了相同的问题,即表格格式不符合预期。我验证了我的工作簿没有隐藏的工作表。工作簿中实际的工作表名称是大写的,但在用于解析文件的C#代码中,我为选项卡名称添加了".ToLower()",现在我可以再次解析Excel文件了。谢谢! - vvvv4d

0
最近我们遇到了这个问题。我们的一个客户在尝试上传他们的Excel文件到我们的网站时出现了错误。我可以在MS Excel中正常打开xlsx文件,并且没有发现任何文件异常。我已经尝试了这里提到的所有解决方案,但都没有起作用。然后我找到了这个链接使用Microsoft.ACE.OLEDB.12.0将数据视为文本。对于我们的情况,有效的解决方法是在连接字符串中添加IMEX=1属性。因此,如果您正在使用Microsoft ACE OLEDB 12.0,则可能会帮助您解决问题。希望这能有所帮助。
<add name="ExcelTextConnection" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR={1};IMEX=1'" />

可能与此案件无关。IMEX属性用于自动识别每列的“数据类型”。 - MMJ

0
如果您仍然遇到此问题,请检查您的权限。我尝试了许多建议,发现我的具体问题是我想要处理的文件受源代码控制,而线程没有权限。我不得不更改整个文件夹的权限,然后它开始工作(我在那里处理了许多文件)... 这也符合许多建议,例如更改文件名或检查文件是否被其他进程锁定。
希望这可以帮助您。

0
只是想分享一下我解决这个问题的方法。我正在将一个 .xlsx 文件上传到 Web 服务器,然后从中读取并批量插入到 SQL Server 中。一直收到相同的错误消息,尝试了所有建议的答案,但都没有起作用。最终,我将文件保存为 Excel 97-2003 (.xls) 格式,这样就可以正常工作了...现在唯一的问题是原始文件有 110,000+ 行。

0

0
这可能发生在工作簿受密码保护的情况下。有一些解决方法可以去除此保护,但大多数在线示例都已过时。无论如何,简单的解决方案是手动取消保护工作簿,否则使用类似OpenXML的编程方式来移除保护。

0

最近我在一个之前列出的答案都不匹配的情境中看到了这个错误。结果发现是与AutoVer冲突了。解决方法:暂时禁用AutoVer。


0

最近我遇到了“System.Data.OleDb.OleDbException (0x80004005): External table is not in the expected format.”的错误。我依赖于Microsoft Access 2010 Runtime。在2018年12月12日自动安装在我的服务器上的更新之前,我的C#代码使用Microsoft.ACE.OLEDB.12.0提供程序运行良好。在安装了2018年12月12日的更新后,我的日志文件中开始出现“External table is not in the expected format”的错误。

我放弃了Microsoft Access 2010 Runtime并安装了Microsoft Access 2013 Runtime,我的C#代码再次开始正常工作,没有出现“System.Data.OleDb.OleDbException (0x80004005): External table is not in the expected format.”的错误。

修复此错误的2013版本 https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

这是我在更新于12月12日自动安装到我的服务器之前使用的2010版本。 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910

上个月我也遇到了这个错误,是在一个自动化流程中发生的。当我以调试模式运行C#代码时,它可以正常运行。后来我发现运行该代码的服务帐户还需要对C:\Windows\Temp文件夹拥有权限。


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