Excel“外部表格不是预期的格式”。
我正在尝试使用下面显示的代码读取Excel(xlsx)文件。 我得到一个“外部表格不是预期的格式”。 错误,除非我已经在Excel中打开文件。 换句话说,我必须先在Excel中打开文件,然后才能从我的C#程序中读取。 xlsx文件在我们的networking上共享。 我怎样才能读取文件,而不必先打开它? 谢谢
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); }
“外部表格不是预期的格式”。 通常会在尝试使用具有以下连接string的Excel 2007文件时发生:Microsoft.Jet.OLEDB.4.0和Extended Properties = Excel 8.0
使用下面的连接string似乎可以解决大多数问题。
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文件的diff版本,请获取文件名(如果其扩展名为.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-engine而不是Jet for Excel 2007)
如果您没有在您的计算机上安装/注册Ace,可以从以下url获取: http : //www.microsoft.com/downloads/details.aspx? FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang =en
它也适用于Excel 2010。
只要加我的情况。 我的xls文件是由一个网站的数据导出function创build的,文件扩展名是xls,通常可以用MS Excel 2003打开。但是Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0都有一个“外部表格未处于预期格式“exception。
最后,就像例外所说的那样,问题在于“不符合预期的格式”。 尽pipe它的扩展名是xls,但是当我用文本编辑器打开它时,它实际上是一个格式良好的html文件,所有数据都在<table>中,每个<tr>是一行,每个<td>是细胞。 那我想我可以用html的方式parsing它。
我有这个相同的问题(使用ACE.OLEDB),为我解决了这个链接:
http://support.microsoft.com/kb/2459087
其要点是,安装多个办公室版本和各种办公室sdk的,程序集等导致registry中的ACEOleDB.dll引用指向OFFICE12文件夹而不是OFFICE14
C:\ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL
从链接:
或者,您可以修改registry项更改dllpath以匹配您的Access版本。
Access 2007应该使用OFFICE12,Access 2010 – OFFICE14和Access 2013 – OFFICE15
(OS:64bit Office:64bit)或(OS:32bit Office:32bit)
Key:HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \
值名称:(默认)
值数据:C:\ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL
(操作系统:64位办公室:32位)
Key:HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \
值名称:(默认)
值数据:C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL
试图在导入的工作表上使用复杂的INDIRECT()公式时,我也看到了这个错误。 我注意到这一点,因为这是两个工作簿之间的唯一区别,一个是导入,另一个不是。 两者都是2007+ .XLSX文件,并安装了12.0引擎。
我确认这是由以下问题:
- 制作一个文件的副本(仍然有问题,所以这不是一些保存 – 作为差异)
- 使用间接公式select工作表中的所有单元格
- 只作为价值粘贴
错误消失了。
我在第三方和Oledb读取XLSX工作簿时遇到了错误。 该问题似乎是一个隐藏的工作表,导致一个错误。 取消隐藏工作表使该工作簿能够导入。
而不是OleDb,您可以使用Excel Interop并以只读方式打开工作表。
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx
该文件可能被另一个进程locking,您需要复制它,然后加载它,如在这篇文章中所述
这也可以是包含图像或图表的文件,请参阅: http : //kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format
build议保存为Excel 2003
只需将我的解决scheme添加到此问题。 我正在上传一个.xlsx文件到networking服务器,然后读取它并批量插入到SQL Server中。 得到这个相同的错误信息,尝试了所有build议的答案,但没有工作。 最终我保存文件为Excel 97-2003(.xls)工作…只有问题,我现在是原始文件有110,000+行。
如果你仍然有这个问题,然后检查你的权限,我尝试了很多这些build议,我的具体问题是,我想处理的文件是在源代码pipe理下,线程没有权限,我不得不改变整个文件夹的权限并开始工作(我正在处理的文件很多)…它也匹配很多build议,如更改文件的名称或检查该文件是不被其他进程lokeed。
我希望它可以帮助你。
我有这个问题,并改变扩展属性为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();
当工作簿受密码保护时,可能会发生这种情况。 有一些解决方法可以消除这种保护,但是您在网上find的大多数示例都是过时的。 无论哪种方式,简单的解决scheme是手动解除工作簿,否则使用类似OpenXML的程序删除保护。
我最近在与之前列出的答案不匹配的上下文中看到了这个错误。 原来是与AutoVer的冲突。 解决办法:暂时禁用AutoVer。