【问题标题】:Excel "External table is not in the expected format."Excel“外部表格不是预期的格式。”
【发布时间】:2010-11-11 11:34:57
【问题描述】:

我正在尝试使用下面显示的代码读取 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);
}

【问题讨论】:

  • FWIW 我在 Excel 工作表上收到了这个,当我试图打开它时,我使用的是当前的 ACE 和建议的扩展属性。当我手动打开文件时,顶部有启用编辑的提示,我需要弄清楚如何自动翻转该位,但如果你得到这个,你可能只需要打开文件,然后启用编辑.我可能会看看我是否可以以只读方式打开文件,我在这个线程中看到了一些关于此的内容。

标签: c# excel-2007 xlsx import-from-excel


【解决方案1】:

“外部表不是预期的格式。”通常在尝试使用带有以下连接字符串的 Excel 2007 文件时发生:Microsoft.Jet.OLEDB.4.0 和 Extended Properties=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;";

【讨论】:

  • 具有讽刺意味的是,我从其他人的应用程序(Scribe)收到了这个错误,但解释仍然为我解决了问题:“另存为”Excel 97-2003,并且错误已修复。
  • 这可能令人难以置信,但我只是将工作表名称更改为全小写并使用 sheet1$
  • 我正在使用 LinqToExcel,为了让 LinqToExcel 使用该查询字符串,我必须将文件重命名为 xlsx。有问题的电子表格确实是一个 excel 97 电子表格,但 odbc 提供者似乎并不关心这一点。一旦我欺骗 LinqToExcel 使用正确的查询字符串,Provider 显然会确定如何独立于文件扩展名来读取文件。在我的情况下方便的漏洞。
  • @Smith 这并不令人难以置信,因为无论何时打开文件并进行任何更改,格式都会得到纠正。仅当您可以控制正在使用的文件时才有用。如果您的应用程序正在接收来自随机用户的文件,那么您仍然会卡住。
【解决方案2】:

感谢这段代码 :) 我真的很感激。对我有用。

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

所以如果你有 diff 版本的 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;"""

【讨论】:

  • 仅供参考:如果您尝试在未安装 Jet OleDb 的 PC 上打开 .xls 文件,这将引发 OleDbException。
  • @Trex 你确定你的最后一行代码是正确的吗?你能在某个编辑器中重新检查一下吗?
【解决方案3】:

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

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

它也适用于 Excel 2010。

【讨论】:

  • 我已经安装了 ACE 引擎,但我需要知道我需要在我的项目中包含哪些参考,以便我的安装程序包含它。并非所有安装了我的应用程序的机器都必须安装 MS Office。
  • 该链接现在给出错误消息 - We're sorry, this download is no longer available
【解决方案4】:

只需添加我的案例。我的xls文件是通过网站的数据导出功能创建的,文件扩展名为xls,可以用MS Excel 2003正常打开。但是Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0都有一个“外部表不是预期格式”异常。

最后,问题是,正如异常所说,“它不是预期的格式”。虽然它的扩展名是xls,但是当我用文本编辑器打开它时,它实际上是一个格式良好的html文件,所有数据都在一个

中,每个是一行,每个
是一个细胞。然后我想我可以用html的方式解析它。

【讨论】:

  • 这也是我的情况,但我的文件实际上是一个 XML。仍然很高兴知道如何使用 OBDC 导入它,但我不认为 its supported.
  • @DavidRogers,我曾经见过类似 XML ODBC Driver 的东西,但从未使用过,你看看 cdata.com/drivers/xml/odbc
  • 同样的情况,我猜魔术开始于用记事本打开文件,事实上我正在投票赞成你的答案,因为我直到现在才向下滚动查看你的帖子(现在我已经用 Html Agility 包打开了文件/解析了它......)但你的答案应该放在首位,纯逻辑:首先打开文件!看看它里面是否有一些 Excel 风格的文件!
  • 如果是 html 文件,只需像这样应用扩展属性:Extended Properties=""HTML Import;HDR=No;IMEX=1
【解决方案5】:

我遇到了同样的问题。使用以下步骤解决:

1.) 点击文件

2.) 选择“另存为”

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

4.) 选择 Excel 97-2003 工作簿

5.) 点击保存按钮

【讨论】:

  • 嘘!甚至不应该考虑恢复为过时的文件格式。在给出这个答案时,97-2003 格式已有 16 年历史,并且已经过时了 12 年。我可以理解几年,但超过十年的过时不应该向专业开发人员建议文件格式需要更旧。
【解决方案6】:

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

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

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

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

来自链接:

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

Access 2007 应使用 OFFICE12、Access 2010 - OFFICE14 和 Access 2013 - 办公室15

(操作系统:64 位 Office:64 位)或(操作系统:32 位 Office:32 位)

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

值名称:(默认)

值数据:C:\Program Files\Common Files\Microsoft Shared\OFFICE14\ACEOLEDB.DLL

(操作系统:64 位办公室:32 位)

键: HKCR\Wow6432Node\CLSID{3BE786A0-0366-4F5C-9434-25CF162E475E}\InprocServer32\

值名称:(默认)

值数据:C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\ACEOLEDB.DLL

【讨论】:

  • 我发现只去程序和功能并修复 ACE 会更容易。 (对我来说,ACE 被命名为 Microsoft Access Runtime 2016)。我假设我遇到了这个问题的变体,并且修复只是为我重置了所有注册表项,而我不必费心 regedit ;-)。
【解决方案7】:

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

我通过以下方式确认这是问题所在:

  • 制作文件的副本(仍然有问题,所以这不是另存为的区别)
  • 使用间接公式选择工作表中的所有单元格
  • 仅作为值粘贴

错误消失了。

【讨论】:

    【解决方案8】:

    我在第三方和 Oledb 阅读 XLSX 工作簿时遇到错误。 该问题似乎是导致错误的隐藏工作表。取消隐藏工作表可以导入工作簿。

    【讨论】:

      【解决方案9】:

      如果文件是只读的,只需将其删除,它就会再次工作。

      【讨论】:

        【解决方案10】:

        我遇到了这个问题,将扩展属性更改为 HTML 导入已根据 Marcus Miris 的 this 帖子修复了它:

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

        【讨论】:

        • 你不知道我为此奋斗了多久,原来从我们的应用程序导出的 XLSX 文件只是重命名了 HTML 文件。谢谢!!!
        【解决方案11】:

        遇到了同样的问题,找到了这个帖子。除了@Smith 在 2013 年 4 月 17 日对已接受答案的评论之外,上述建议均无济于事。

        我的问题的背景与@zhiyazw 的背景足够接近——基本上是尝试将导出的 Excel 文件(在我的情况下为 SSRS)设置为 dtsx 包中的数据源。经过一番修补,我所做的只是重命名工作表。它不必像@Smith 建议的那样是小写的。

        我想 ACE OLEDB 期望 Excel 文件遵循某种 XML 结构,但不知何故 Reporting Services 并没有意识到这一点。

        【讨论】:

        • 我遇到了同样的问题,表格不是预期的格式。我确认我的工作簿没有隐藏的工作表。工作簿中的实际工作表名称是大写的,但在 C# 代码中解析文件我为选项卡名称添加了 .ToLower(),现在我可以再次解析 Excel 文件。谢谢!
        【解决方案12】:

        我知道这是一篇很老的帖子,但我也可以就我如何设法解决这个问题做出贡献。

        我还使用“Microsoft.ACE.OLEDB.12.0”作为提供者。 当我的代码尝试读取 XLSX 文件时,它收到错误“外部表不是预期的格式”。 但是,当我在 Excel 中打开文件,然后代码尝试读取它时……它起作用了。

        解决方案: 我将 Office 365 与公司文档一起使用,就我而言,解决方案非常简单,我只需要禁用文档的敏感性,将其设置为“公共”。 详情:即使保存为“公共”后,绿色的勾仍然标记在“内部使用”中,但之后问题仍然解决。

        【讨论】:

          【解决方案13】:

          该文件可能被另一个进程锁定,您需要复制它然后加载它,如 post

          中所述

          【讨论】:

            【解决方案14】:

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

            建议保存为 Excel 2003

            【讨论】:

              【解决方案15】:

              只需添加我对这个问题的解决方案。我正在将 .xlsx 文件上传到网络服务器,然后从中读取并批量插入到 SQL Server。收到相同的错误消息,尝试了所有建议的答案,但没有一个有效。最终,我将文件保存为 excel 97-2003 (.xls),它有效……我现在唯一的问题是原始文件有 110,000 多行。

              【讨论】:

                【解决方案16】:

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

                希望对你有帮助。

                【讨论】:

                  【解决方案17】:

                  除了 OleDb,您可以使用 Excel 互操作并以只读方式打开工作表。

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

                  【讨论】:

                  • Excel 互操作不是使用 Excel 的推荐方法。它可能会导致很多问题,因此不建议使用。
                  • 虽然这是一篇旧文章,但我同意 MaxOvrdrv 的观点,使用互操作不是一个好主意,应该避免,如果没有其他原因,只是需要在服务器上完整安装 Excel。
                  • 你绝对不应该这样做。
                  【解决方案18】:

                  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();
                  

                  【讨论】:

                  • 它没有。问题还是会出现,我还没有找到原因,因为我的文件都是excel 2007的,有的可以,有的不行。
                  • 您有该声明的来源吗?我不认识自己,只是想知道。 :-)
                  【解决方案19】:

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

                  【讨论】:

                    【解决方案20】:

                    我最近在与之前列出的任何答案都不匹配的上下文中看到了此错误。原来是和AutoVer有冲突。解决方法:暂时禁用 AutoVer。

                    【讨论】:

                      【解决方案21】:

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

                      【讨论】:

                        【解决方案22】:

                        我最近遇到了这个“System.Data.OleDb.OleDbException (0x80004005):外部表不是预期的格式。”发生错误。我依赖于 Microsoft Access 2010 Runtime。在 2018 年 12 月 12 日自动安装在我的服务器上的更新之前,我的 C# 代码使用 Microsoft.ACE.OLEDB.12.0 提供程序运行良好。安装 2018 年 12 月 12 日的更新后,我的日志文件中开始出现“外部表不是预期格式”。

                        我放弃了 Microsoft Access 2010 运行时并安装了 Microsoft Access 2013 运行时,我的 C# 代码再次开始工作,没有“System.Data.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 文件夹的权限。

                        【讨论】:

                          【解决方案23】:

                          我的范围包括模板下载并在模板填充数据时验证模板 所以,

                          1) 下载带有标题行的模板 (.xlsx) 文件。该文件是使用 openxml 生成的,并且运行良好。

                          2) 上传相同的文件而不改变它的下载状态。这将导致连接错误并失败(OLEDB 连接用于读取 excel 表)。

                          如果数据被填满,程序会按预期运行。

                          如果我们打开它并保存并将其转换为 excel 格式并且它运行良好,那么任何人都知道该问题与我们正在创建的文件有关,它是 xml 格式。

                          知道下载首选文件类型的 excel 吗?

                          【讨论】:

                          • 你不应该在你的答案中提问,如果你需要你的问题的答案,如果需要的话单独问他们。
                          【解决方案24】:

                          使用一些旧代码时遇到了同样的通用异常。很难追查这个问题,所以我想我会在这里添加,以防它帮助别人。

                          在我的例子中,项目中其他地方的代码在 OleDbConnection 尝试打开文件之前打开 Excel 文件上的 StreamReader(这是在基类中完成的)。 p>

                          所以基本上我只需要先在 StreamReader 对象上调用Close(),然后我就可以成功打开 OleDb 连接。它与 Excel 文件本身或 OleDbConnection 字符串(这自然是我首先查看的地方)无关。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2015-04-02
                            • 2016-07-04
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2017-04-08
                            • 1970-01-01
                            相关资源
                            最近更新 更多