Excel“外部表不是预期的格式。”
-
16-09-2019 - |
题
我正在尝试使用下面所示的代码读取 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);
}
解决方案
“外部表不是预期的格式。”通常发生当试图使用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;";
其他提示
感谢这个代码:)我真的很感激。我的作品。
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的进入评论,使用的王牌引擎,而不是喷气机为Excel 2007)的
如果您尚未安装ACE /你的机器上注册,就可以在得到它:的 https://www.microsoft.com/en-US/download/details.aspx?id=13255
它适用为Excel 2010以及
只需添加我的情况。我的XLS文件被从网站上的数据导出功能创建的文件扩展是XLS,可以通过正常的MS Excel 2003打开,但都Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0得到了一个“外部表不是预期的格式”的异常。
最后,问题是,正如例外说,“这不是预期的格式”。虽然它的extention名字是XLS,但是当我用文本编辑器打开它,它实际上是一个结构良好的HTML文件,所有的数据都在一个
是细胞。然后,我想我可以在HTML的方式解析它。
我有同样的问题(使用ACE.OLEDB)什么解决这对我来说是此链接: http://support.microsoft.com/kb/2459087 它的要点是,安装多个办公室版本和各种办公SDK的,组件等已导致在注册表指向OFFICE12文件夹而不是OFFICE14的ACEOleDB.dll参考
从链接:
我们也看到这种错误,当试图用复杂的间接()公式的片,正在进口。我注意到这一点,因为这是唯一的差之间的两个工作簿,其中一个是进口和其它不是。两者都是2007年+.阅读文件,以及12.0发动机的安装。 我证实了这一问题通过:
和错误消失。 我正在与第三方和XLSX工作簿的OLEDB读取错误。 这个问题似乎是一个隐藏的工作表会导致错误。取消隐藏在工作表启用工作簿导入。 我遇到了这个问题,并将扩展属性更改为 HTML Import 修复了它 这 马库斯·米里斯发表文章:
您可以使用 Excel Interop 并以只读方式打开工作表,而不是 OleDb。 遇到同样的问题,并发现此线程。的建议没有上述帮助,除了@史密斯对4月17日'13接受的答案评论。 我的问题的背景是足够接近@ zhiyazw的 - 基本上是试图设置导出Excel文件(在我的情况SSRS)作为DTSX包中的数据源。我所做的一切,周围的一些修修补补后,被重新命名工作表。它不必是小写作为@Smith曾建议。 我想ACE OLEDB预计Excel文件遵循一定的XML结构,但不知何故Reporting Services是没有意识到这一点。 这excel文件地址可以具有一个不正确的扩展名。你可以改变从XLS扩展到XLSX,反之亦然,然后重试。 如果该文件是只读的,只是将其删除,它应该工作了。 该文件可能被其他进程锁定,你需要为它说,它复制然后加载它在这个的帖子 强> 这也可以是包含图像或图表的文件,请参阅: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format 建议另存为Excel 2003 只是增加我解决这个问题。我上传.xlsx文件到Web服务器,然后从中读取和批量插入到SQL Server。渐渐此相同的错误消息,尝试了所有的建议答案,但没有奏效。最后,我将文件保存为Excel 97-2003(.xls的),它的工作...只有我现在的问题是,原来的文件有110,000+行。 如果你仍然有这个问题,然后检查您的权限,我试过很多的这些建议,我的具体问题是,我想处理的文件是源代码管理下,线程没有权限,我不得不改变整个文件夹的权限,并开始工作(我是在那里处理很多文件)...这也符合像更改文件名或检查文件不被其他进程loicked很多建议。 我希望它可以帮助你。 ACE已经所取代JET<强> ACE支持办公室的所有先前版本强> 此代码的工作好! 当工作簿是密码保护可以发生这种情况。有一些变通办法来消除这种保护,但大多数的你会发现在线的例子是过时的。无论哪种方式,简单的解决方案是手动取消保护工作簿,否则使用类似的OpenXML以编程去除保护。 我最近在未与任何以前列出的答案的情况下看到了这个错误。它竟然是用 AutoVer 冲突。解决方法:暂时禁用AutoVer 我最近有这种“System.Data.OleDb.OleDbException(0X80004005):外部表不在预期的格式。”错误发生。我靠上的Microsoft Access 2010运行库。在此之前2018我的C#代码运行正常使用Microsoft.ACE.OLEDB.12.0供应商,已自动在我的服务器上安装了12月12日更新。从安装2018 12月12日更新后我开始了“外部表不是预期的格式”在我的日志文件。 我抛弃了的Microsoft Access 2010 Runtime和安装的Microsoft Access 2013 Runtime和我的C#代码开始,没有再工作“System.Data.OleDb.OleDbException(0X80004005):外部表不在预期的格式”错误。 2013版本固定这个错误对于我 https://www.microsoft.com/en-us/下载/ confirmation.aspx?ID = 39358 2010版本,在此之前,我是12月12日服务器上自动安装更新为我工作。 https://www.microsoft.com/en-us/下载/ confirmation.aspx?ID = 10910 https://www.microsoft.com/en-us/下载/ confirmation.aspx?ID = 10910 我也有这个错误发生在上个月的自动化过程。 C#代码运行得很好,当我跑了调试。我发现,运行该服务帐户中的代码也需要权限到C:\的Windows \ Temp文件夹 我的范围由模板下载的,当它充满了数据验证模板 所以, 1)下载的模板(.XLSX)与标题行文件。使用的 OPENXML 强>生成文件和它的工作完美。 2)上载相同的文件,而不脱离它的下载状态的任何变化。这将导致连接错误和失败(OLEDB连接使用用于读取excel工作表)。 下面,如果作为所期望的数据被填充程序工作。 有一个想法的问题,与我们正在创造它在文件连接任何人的 XML 格式,如果我们打开它,只是保存在将其转换为Excel格式,而且运作良好。 任何想法与优选的文件类型下载Excel? 一些旧的代码工作,过这同一般异常来。很难追查这个问题,所以我想我会在这里补充的情况下,它可以帮助别人。 在我的情况下,有代码的其他地方在这是在Excel中打开一个StreamReader文件的项目的前的使用与OleDbConnection试图打开该文件(这是在基类完成)。 所以基本上我只需要首先调用StreamReader对象上 不隶属于 StackOverflow
|