我正在尝试使用下面所示的代码读取 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参考

  

C:\ Program Files文件\共同文件\ Microsoft共享\ OFFICE14 \ ACEOLEDB.DLL

从链接:

  

另外,你可以通过修改注册表键值更改DLL的路径,以匹配您的Access版本。

     

2007年访问应该使用OFFICE12,访问2010 - OFFICE14和访问   2013 - OFFICE15

     

(OS:64办公室:64)或(OS:32位办公室:32位)

     

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

     

值名称:(默认)

     

数值数据:C:\ Program Files文件\ Common Files文件\微软   共享\ OFFICE14 \ ACEOLEDB.DLL

     

(OS:64办公室:32位)

     

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

     

值名称:(默认)

     

值数据:C:\程序文件(x86)\共同文件\微软   共享\ OFFICE14 \ ACEOLEDB.DLL

我们也看到这种错误,当试图用复杂的间接()公式的片,正在进口。我注意到这一点,因为这是唯一的差之间的两个工作簿,其中一个是进口和其它不是。两者都是2007年+.阅读文件,以及12.0发动机的安装。

我证实了这一问题通过:

  • 复制的文件(仍然有问题,所以它不是一些保存的差异)
  • 选择的所有细胞中的薄片间接的公式
  • 粘贴作为值只

和错误消失。

我正在与第三方和XLSX工作簿的OLEDB读取错误。 这个问题似乎是一个隐藏的工作表会导致错误。取消隐藏在工作表启用工作簿导入。

我有同样的问题。其中作为使用这些步骤解决:

<强> 1。)点击文件

<强> 2)。选择 “另存为”

第3。)点击下拉(保存类型)

“在这里输入的图像描述”

<强> 4)选择Excel 97-2003工作簿

“在这里输入的图像描述”

<强> 5。)点击保存按钮

“在这里输入的图像描述”

我遇到了这个问题,并将扩展属性更改为 HTML Import 修复了它 马库斯·米里斯发表文章:

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

您可以使用 Excel Interop 并以只读方式打开工作表,而不是 OleDb。

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

遇到同样的问题,并发现此线程。的建议没有上述帮助,除了@史密斯对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支持办公室的所有先前版本

此代码的工作好!

        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我的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对象上Close(),然后我可以成功打开OLEDB连接。它有什么做的Excel文件本身,或与OleDbConnection的字符串(这自然是我在那里看着第一)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top