我正在尝试使用下面显示的代码读取Excel(xlsx)文件。我得到一个“外部表不是预期的格式。”错误,除非我已在Excel中打开该文件。换句话说,我必须首先在Excel中打开文件,然后才能从我的C#程序中读取。 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);
}
答案 0 :(得分:232)
“外部表格不符合预期格式。”通常在尝试使用带有以下连接字符串的Excel 2007文件时发生:Microsoft.Jet.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;";
答案 1 :(得分:23)
感谢您的代码:)我真的很感激。适合我。
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;"""
答案 2 :(得分:14)
(我的评论声誉太低,但这是对JoshCaba的参赛作品的评论,使用Ace-engine代替Jet for Excel 2007)
如果您的机器上没有安装/注册Ace,您可以通过以下方式获取:http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en
它也适用于Excel 2010。
答案 3 :(得分:8)
添加我的案例。我的xls文件是由网站的数据导出功能创建的,文件扩展名是xls,它可以通常由MS Excel 2003打开。但是Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0都得到了“外部表格不是预期的格式“例外。
最后,问题是,正如例外所说,“它不是预期的格式”。虽然它的扩展名是xls,但是当我用文本编辑器打开它时,它实际上是一个格式良好的html文件,所有数据都在< table>中,每个< tr>是一行,每个< td>是一个细胞。然后我想我可以用HTML格式解析它。
答案 4 :(得分:3)
我有同样的问题(使用ACE.OLEDB)以及为我解决的是这个链接:
http://support.microsoft.com/kb/2459087
它的要点是安装多个办公室版本和各种办公室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年 - OFFICE15
(OS:64bit Office:64bit)或(OS:32bit Office:32bit)
密钥:HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \
值名称:(默认)
值数据:C:\ Program Files \ Common Files \ Microsoft 共享\ OFFICE14 \ ACEOLEDB.DLL
(操作系统:64位办公室:32位)
键: HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32的\
值名称:(默认)
值数据:C:\ Program Files(x86)\ Common Files \ Microsoft 共享\ OFFICE14 \ ACEOLEDB.DLL
答案 5 :(得分:2)
在尝试在正在导入的工作表上使用复杂的INDIRECT()公式时,我也看到了这个错误。我注意到了这一点,因为这是两个工作簿之间的唯一区别,其中一个是导入而另一个不是。两者都是2007+ .XLSX文件,并且安装了12.0引擎。
我通过以下方式确认了这个问题:
并且错误消失了。
答案 6 :(得分:2)
我在第三方和Oledb读取XLSX工作簿时遇到错误。 该问题似乎是一个导致错误的隐藏工作表。取消隐藏工作表可以导入工作簿。
答案 7 :(得分:1)
您可以使用Excel Interop并以只读方式打开工作表,而不是OleDb。
答案 8 :(得分:1)
如果该文件是只读文件,只需将其删除即可,它应该可以再次工作。
答案 9 :(得分:1)
我遇到了这个问题,并将扩展属性更改为HTML导入按照this帖子修复了Marcus Miris:
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
& ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"
答案 10 :(得分:1)
该excel文件地址的扩展名可能不正确。您可以将扩展名从xls更改为xlsx,反之亦然,然后重试。
答案 11 :(得分:1)
遇到同样的问题并找到了该线程。除了@Smith在13年4月17日对已接受答案的评论外,以上建议均无济于事。
问题的背景与@zhiyazw的背景足够接近-基本上是试图将导出的Excel文件(在我的情况下为SSRS)设置为dtsx包中的数据源。经过一番修改后,我所做的只是重命名工作表。不必像@Smith所建议的那样小写。
我想ACE OLEDB希望Excel文件遵循某种XML结构,但是Reporting Services不知何故。
答案 12 :(得分:0)
我知道这是一篇很老的文章,但是我也可以就如何解决这个问题做出自己的贡献。
我还使用“ Microsoft.ACE.OLEDB.12.0”作为提供程序。 当我的代码尝试读取XLSX文件时,它收到错误“外部表不是预期的格式”。 但是,当我在Excel中将文件保持打开状态,然后代码尝试读取它时,它就起作用了。
解决方案: 我将Office 365与公司文档一起使用,在我的情况下,解决方案非常简单,我只需要禁用文档的敏感性,将其设置为“公开”即可。 详细信息:即使在保存为“公共”之后,绿色复选标记仍保留在“内部使用”中,但此后问题仍然得到解决。
答案 13 :(得分:0)
使用一些较旧的代码,并遇到了相同的通用异常。很难找到问题所在,所以我想在这里补充一下,以防其他人受到影响。
在我的情况下,项目中其他地方的代码正在 之前打开Excel文件上的StreamReader,而OleDbConnection试图打开文件(这是在基类中完成的)。>
因此,基本上我只需要首先在StreamReader对象上调用Close()
,然后我才能成功打开OleDb Connection。它与Excel文件本身或OleDbConnection字符串(自然是我刚开始的地方)无关。
答案 14 :(得分:0)
我的范围包括模板下载,并在填充数据时验证模板 所以,
1)下载带有标题行的模板(.xlsx)文件。该文件是使用 openxml 生成的,并且运行正常。
2)上载相同的文件,下载状态不变。这将导致连接错误并失败(OLEDB连接用于读取Excel工作表)。
如果数据已满,程序将按预期运行。
任何人都知道问题与我们正在创建的文件有关,如果我们打开它并以 xml 格式保存它,只需将其保存为excel格式即可。
是否有下载首选文件类型的excel的想法?
答案 15 :(得分:0)
我最近遇到了此“ 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
2010版本在12月12日自动安装到我的服务器上的更新之前适用于我。 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文件夹的权限。
答案 16 :(得分:0)
我最近在上下文中看到此错误,该错误与之前列出的任何答案都不匹配。结果证明是与AutoVer的冲突。解决方法:暂时禁用AutoVer。
答案 17 :(得分:0)
当工作簿受密码保护时,可能会发生这种情况。有一些解决方法可以删除此保护,但您在网上找到的大多数示例都已过时。无论哪种方式,简单的解决方案是手动取消保护工作簿,否则使用类似OpenXML的程序以编程方式删除保护。
答案 18 :(得分:0)
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();
答案 19 :(得分:0)
如果你仍然有这个问题,那么检查你的权限,我尝试了很多这些建议,我的具体问题是我想要处理的文件是在源代码控制下,而且线程没有权限,我不得不改变它整个文件夹的权限,它开始工作(我在那里处理许多文件)...它也匹配许多建议,如更改文件的名称或检查该文件不被另一个进程欺骗。
我希望它可以帮到你。
答案 20 :(得分:0)
只需添加我的解决方案即可解决此问题。我正在将.xlsx文件上传到网络服务器,然后从中读取并批量插入到SQL Server。得到这个相同的错误消息,尝试了所有建议的答案但没有工作。最终我将文件保存为excel 97-2003(.xls),这个文件有效...我现在唯一的问题是原始文件有110,000多行。
答案 21 :(得分:0)
这也可以是包含图片或图表的文件,请参阅:http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format
建议保存为Excel 2003
答案 22 :(得分:0)
该文件可能被其他进程锁定,您需要将其复制然后按照 post
中的说明加载它