Excel“外部表格不是预期的格式。”

我尝试使用下面所示的代码读取一个 Excel (xlsx)文件。我得到一个“外部表格不是预期的格式”除非我已经在 Excel 中打开了该文件,否则将出现错误。换句话说,我必须先在 Excel 中打开文件,然后才能从 C # 程序中读取 if。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);
}
429067 次浏览

您可以使用 ExcelInterop 而不是 OleDb,并以只读方式打开工作表。

Https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx

“外部表格不是预期的格式。”通常在尝试使用 Excel2007文件和使用 Microsoft 的连接字符串时发生。OLEDB. 4.0和扩展属性 = Excel 8.0

使用以下连接字符串似乎可以解决大多数问题。

public static string path = @"C:\src\RedirectApplication\RedirectApplication\301s.xlsx";
public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

谢谢你的代码:)我真的很感激,对我很有用。

public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

因此,如果你有 Excel 文件的差异版本,获取文件名,如果它的扩展名是 。 xlsx,使用以下方法:

Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

如果是 。 xls,使用:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""

(我的声誉太低,无法评论,但这是对 JoshCaba 的条目的评论,使用 Ace 引擎而不是 Jet for Excel 2007)

如果您的机器上没有安装/注册 Ace,您可以在: https://www.microsoft.com/en-US/download/details.aspx?id=13255获得它

它也适用于 Excel2010。

在试图在要导入的工作表上使用复杂的 INDIRECT ()公式时,我也看到了这个错误。我注意到这一点是因为这是两个工作簿之间的唯一区别,其中一个是导入的,而另一个不是。两者都是在2007年以后。XLSX 文件,并且安装了12.0引擎。

我通过以下方式证实了这个问题:

  • 复制文件(仍然存在这个问题,所以它不是某种保存-作为区别)
  • 使用间接公式选择工作表中的所有单元格
  • 仅粘贴为值

错误消失了。

我也遇到过同样的问题(使用 ACE.OLEDB) ,解决这个问题的是这个链接:

Http://support.microsoft.com/kb/2459087

其要点在于,安装多个 Office 版本和各种 office sdk、程序集等导致注册表中的 ACEOleDB.dll 引用指向 Office12文件夹,而不是指向

C: Program Files Common Files Microsoft Shared OFFICE14 ACEOLEDB.DLL

链接如下:

或者,您可以修改注册表项,更改 dll 路径以匹配 Access 版本的路径。

Access2007应使用 OFFICE12、 Access2010-Office14和 Access 2013年办公室15

(OS: 64位 Office: 64位)或(OS: 32位 Office: 32位)

密钥: HKCR CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E } InprocServer32

值名称: (默认值)

值数据: C: 程序文件公共文件 Microsoft 共用办公室14 ACEOLEDB.DLL

(OS: 64位 Office: 32位)

关键: HKCRWow6432NodeCLSID {3BE786A0-0366-4F5C-9434-25CF162E475E } InprocServer32

值名称: (默认值)

值数据: C: Program Files (x86) Common Files Microsoft 共用办公室14 ACEOLEDB.DLL

该文件可能被另一个进程锁定,您需要复制它,然后加载它,因为它说在这个 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳

我在第三方和 Oledb 阅读 XLSX 工作簿时出现了错误。 问题似乎是导致错误的隐藏工作表。取消隐藏工作表使工作簿能够导入。

这也可以是一个包含图像或图表的文件,请参见: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format

建议另存为 Excel2003

只是把我的解决方案加到这个问题上。我在上传一个。Xlsx 文件到 webserver,然后从中读取并批量插入到 SQLServer。正在收到同样的错误消息,尝试了所有建议的答案,但没有一个有效。最后,我将该文件保存为 excel 97-2003(。现在唯一的问题是原始文件有110,000多行。

加上我的案子。我的 xls 文件是通过一个网站的数据导出功能创建的,文件扩展名是 xls,通常可以用 MSExcel2003打开。但是微软。Jet.OLEDB.4.0和 Microsoft.ACE.OLEDB.12.0得到了一个“外部表不符合预期格式”异常。

最后,问题是,正如异常所说,“它不是预期的格式”。虽然它的扩展名是 xls,但是当我用文本编辑器打开它时,它实际上是一个格式良好的 html 文件,所有数据都在 < table > 中,每个 < tr > 是一行,每个 < td > 是一个单元格。然后我想我可以用 HTML 的方式解析它。

如果你仍然有这个问题,那么检查你的权限,我尝试了很多这些建议,我的具体问题是,我想处理的文件是在源代码控制和线程没有权限,我不得不改变整个文件夹的权限,它开始工作(我在那里处理许多文件) ... 它也匹配许多建议,如更改文件的名称或检查文件没有锁定的另一个进程。

希望能帮到你。

我有这个问题,并改变扩展属性 HTML 导入修复它,根据 这个文章马库斯米里斯:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
& ";Extended Properties=""HTML Import;HDR=No;IMEX=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();

当工作簿受密码保护时,可能会发生这种情况。有一些变通方法可以去除这种保护,但是你在网上找到的大多数例子都已经过时了。无论哪种方式,简单的解决方案是手动取消对工作簿的保护,否则使用 OpenXML 之类的东西以编程方式取消保护。

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

遇到了同样的问题,发现了这个帖子。除了@Smith 在1713年4月17日对公认答案的评论,以上的建议都没有帮助。

我的问题的背景非常接近@ziyazw 的问题——基本上是试图将导出的 Excel 文件(在我的例子中是 SSRS)设置为 dtsx 包中的数据源。经过一番修修补补之后,我所做的就是重命名工作表。它不必像@Smith 建议的那样是小写的。

我认为 ACEOLEDB 希望 Excel 文件遵循某种 XML 结构,但 ReportingServices 不知道这一点。

Excel 文件地址可能有不正确的扩展名。您可以将扩展名从 xls 更改为 xlsx,反之亦然,然后再试一次。

我最近有个系统。百科。OleDb.OleDbException (0x80004005) : 外部表格不是预期的格式。”发生错误。我依赖于 MicrosoftAccess2010Runtime。在2018年12月12日在我的服务器上自动安装更新之前,我的 C # 代码使用 Microsoft.ACE.OLEDB.12.0提供程序运行良好。在安装了2018年12月12日的更新之后,我开始在日志文件中获得“外部表不符合预期格式”。

我放弃了 MicrosoftAccess2010运行时,安装了 MicrosoftAccess2013运行时,我的 C # 代码在没有“ System。百科。OleDb.OleDbException (0x80004005) : 外部表格不是预期的格式。”错误。

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 文件夹的权限。

如果该文件是只读的,只需删除它,它应该再次工作。

我也有同样的问题。用这些步骤解决了:

点击文件

2)选择「另存为」

点击下拉菜单(另存为类型)

enter image description here

4)选择 Excel97-2003工作簿

enter image description here

点击保存按钮

enter image description here

使用一些较旧的代码时,遇到了同样的通用异常。很难找到这个问题,所以我想在这里补充一下,以防对其他人有帮助。

在我的例子中,项目中的其他地方有代码正在打开 Excel 文件 之前上的 StreamReader,OleDbConnection 试图打开该文件(这是在一个基类中完成的)。

所以基本上我只需要先在 StreamReader 对象上调用 Close(),然后就可以成功地打开 OleDb Connection。它与 Excel 文件本身或 OleDbConnection 字符串没有任何关系(这是我最初查看的地方)。

我知道这是一个非常老的职位,但我可以提供我的贡献太,关于我如何设法解决这个问题。

我还使用“ Microsoft.ACE.OLEDB. 12.0”作为提供程序。 当我的代码尝试读取 XLSX 文件时,它收到错误“ Externaltable 不是预期的格式” 然而,当我在 Excel 中保持文件打开,然后代码尝试读取它... 它工作了。

解决方案: 我使用 Office 365处理公司文档,在我的案例中,解决方案非常简单,我只需要禁用文档的敏感性,将其设置为“公开”。 细节: 即使保存为“公共”绿色检查仍然标记为“内部使用”,但问题仍然得到解决。

enter image description here

我曾经在我托管的 IIS 网站上发生过这种情况,对于我以前解析得很好的文件,这种错误很少但是会周期性地出现。只需重新启动适用的应用程序池似乎就可以解决这个问题。不知道为什么..。

这种事最近才发生在我们身上。我们的一个客户在尝试将他们的 Excel 文件上传到我们的网站时,出现了这个错误。我可以打开 msexcel 上的 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'" />