关于c#:Excel“外部表格不是预期的格式。”

Excel “External table is not in the expected format.”

我正在尝试使用下面显示的代码读取Excel(XLSX)文件。我得到一个"外部表不是预期的格式。"错误,除非文件已经在Excel中打开。换句话说,我必须先在Excel中打开文件,然后才能从我的C程序中读取if。XLSX文件在我们的网络上共享。如何在不必先打开文件的情况下读取该文件?谢谢

1
2
3
4
5
6
7
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);
}

"外部表不是预期格式。"尝试使用连接字符串为:microsoft.jet.oledb.4.0且扩展属性=Excel 8.0的Excel 2007文件时,通常会发生这种情况。

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

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


谢谢你的密码:)我真的很感激。为我工作。

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

因此,如果您有Excel文件的不同版本,请获取文件名,如果扩展名为.xlsx,请使用以下命令:

2

如果是.xls,请使用:

1
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,可以从以下网址获取:http://www.microsoft.com/downloads/details.aspx?家庭ID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en

它也适用于Excel2010。


加上我的箱子。我的XLS文件是由一个网站的数据导出函数创建的,文件扩展名是XLS,它通常可以由MS Excel 2003打开。但是,Microsoft.jet.oledb.4.0和Microsoft.ace.oledb.12.0都出现了"外部表不是预期格式"异常。

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

中,每个

都是一行,每个

都是一个单元格。然后我想我可以用HTML方式解析它。


我有同样的问题(使用ace.oledb),解决这个问题的是这个链接:

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

其要点是,安装多个Office版本以及各种Office SDK、程序集等导致注册表中指向Office12文件夹而不是Office14的aceoledb.dll引用。

0

从链接:

Alternatively, you can modify the registry key changing the dll path to match that of your Access version.

Access 2007 should use OFFICE12, Access 2010 - OFFICE14 and Access
2013 - OFFICE15

(OS: 64bit Office: 64bit) or (OS: 32bit Office: 32bit)

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

Value Name: (Default)

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

(OS: 64bit Office: 32bit)

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

Value Name: (Default)

Value Data: C:\Program Files (x86)\Common Files\Microsoft
Shared\OFFICE14\ACEOLEDB.DLL


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

我通过以下方式确认了这一问题:

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

错误就消失了。


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


我也有同样的问题。通过以下步骤解决:

1)单击文件

2.)选择"另存为"

3.)单击下拉列表(另存为类型)

enter image description here

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

enter image description here

5.)单击"保存"按钮

enter image description here


如果文件是只读的,只需删除它,它就可以再次工作。


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


遇到同样的问题,找到了这个线程。除了@smith在2013年4月17日对已接受答案的评论之外,上述建议都没有帮助。

我的问题背景与@zhiyazw非常接近,基本上是试图将导出的excel文件(在我的例子中是ssrs)设置为dtsx包中的数据源。我做了一些修改后,只是重新命名工作表。它不必像@smith建议的那样是小写的。

我想ace-oledb希望Excel文件遵循某种XML结构,但不知何故ReportingServices并不知道这一点。


我遇到了这个问题,将扩展属性改为html import,并根据Marcus Miris的文章修复了它:

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

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

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


文件可能被另一个进程锁定,您需要复制它,然后按照本文中的说明加载它。


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

建议保存为Excel 2003


如果您仍然有这个问题,请检查您的权限,我尝试了许多这些建议,我的具体问题是,我要处理的文件受源代码管理,线程没有权限,我必须更改整个文件夹的权限,它开始工作(我正在处理其中的许多文件)…它还匹配许多建议,例如更改文件名或检查文件是否被其他进程占用。

希望对你有帮助。


我的范围包括模板下载,并在模板中填充数据时对其进行验证。所以,

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

2)上传同一文件,下载状态不变。这将导致连接错误并失败(OLEDB连接用于读取Excel工作表)。

在这里,如果数据被填充,程序将按预期工作。

任何有想法的人都知道这个问题与我们正在创建的文件有关,如果我们打开它并保存它,将其转换为Excel格式,它就会很好地工作。

有没有办法下载首选文件类型的Excel?


ace已经取代了jet

ACE支持Office的所有早期版本

这个代码很好用!

1
2
3
4
5
6
7
8
9
10
11
        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。


我最近收到了这个"system.data.oledb.oledbexception(0x80004005):外部表不是预期格式。"出现了错误。我依赖于Microsoft Access 2010运行时。在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=10910https://www.microsoft.com/en-us/download/confirmation.aspx?ID=10910

我上个月在一个自动化过程中也发生了这个错误。C代码在我进行调试时运行良好。我发现运行代码的服务帐户还需要C:windows emp文件夹的权限。


只是在这个问题上添加我的解决方案。我正在将.xlsx文件上载到Web服务器,然后从中读取并批量插入到SQL Server。收到同样的错误信息,尝试了所有建议的答案,但没有成功。最后,我将文件保存为Excel97-2003(.xls),它起作用…我现在唯一的问题是原始文件有110000多行。