Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel“外部表格的格式不符合要求。”_C#_Excel 2007_Xlsx_Import From Excel - Fatal编程技术网

C# Excel“外部表格的格式不符合要求。”

C# Excel“外部表格的格式不符合要求。”,c#,excel-2007,xlsx,import-from-excel,C#,Excel 2007,Xlsx,Import From Excel,我正在尝试使用下面显示的代码读取Excel xlsx文件。我得到的外部表不是预期的格式。错误,除非已在Excel中打开该文件。换句话说,我必须先在Excel中打开文件,然后才能从C程序中读取if。xlsx文件在我们网络上的共享中。如何在不打开文件的情况下读取文件? 谢谢 代替OleDb,您可以使用Excel互操作并以只读方式打开工作表 外部表不是预期的格式。通常在尝试使用连接字符串为Microsoft.Jet.OLEDB.4.0且扩展属性=Excel 8.0的Excel 2007文件时发生 使用

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


代替OleDb,您可以使用Excel互操作并以只读方式打开工作表


外部表不是预期的格式。通常在尝试使用连接字符串为Microsoft.Jet.OLEDB.4.0且扩展属性=Excel 8.0的Excel 2007文件时发生

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

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,请使用:

我的声誉太低,无法发表评论,但这是对JoshCaba条目的评论,使用Ace引擎而不是JetforExcel2007

如果您的计算机上没有安装/注册Ace,您可以通过以下网址获取:


它也适用于Excel 2010。

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

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

制作文件副本仍然存在问题,因此它与另存为没有什么区别 使用间接公式选择工作表中的所有单元格 仅粘贴为值
错误消失了。

我在ACE.OLEDB上遇到了同样的问题,解决这个问题的方法是以下链接:

其要点是,安装多个office版本和各种office 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年-办公室15

OS:64位Office:64位或OS:32位Office:32位

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

值名称:默认值

值数据:C:\Program Files\Common Files\Microsoft 共享\OFFICE14\ACEOLEDB.DLL

OS:64位Office:32位

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

值名称:默认值

值数据:C:\Program Files x86\Common Files\Microsoft 共享\OFFICE14\ACEOLEDB.DLL


该文件可能被另一个进程锁定,您需要复制它,然后按此

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

这也可以是包含图像或图表的文件,请参见:


建议将我的解决方案另存为Excel 2003

。我将一个.xlsx文件上传到Web服务器,然后从中读取并批量插入SQL Server。收到相同的错误消息时,尝试了所有建议的答案,但均无效。最后,我将文件保存为Excel97-2003.xls,它可以工作。。。我现在唯一的问题是原始文件有110000多行

只需添加我的案例即可。我的xls文件是通过网站的数据导出功能创建的,文件扩展名为xls,可以通过MS Excel 2003正常打开。但是,Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0都获得了一个外部表,该表不是预期的格式异常


最后,问题是,正如异常所说,它不是预期的格式。虽然它的扩展名是xls,但当我用文本编辑器打开它时,它实际上是一个格式良好的html文件,所有数据都在一个数组中,每个数组都是一行,每个数组都是一个单元格。然后我想我可以用html的方式解析它。

如果你仍然有这个问题,那么检查你的权限,我尝试了很多建议,我的具体问题是我想要处理的文件是在源代码管理下的,线程没有权限,我不得不改变整个文件夹的权限,它开始工作,我在那里处理许多文件。。。它还与许多建议相匹配,如更改文件名或检查文件是否未被其他进程访问


我希望它能帮助你

我遇到了这个问题,根据Marcus Miris的帖子,将扩展属性更改为HTML导入解决了这个问题:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"
ACE已取代JET Ace支持Office的所有早期版本

这鳕鱼 e工作得很好


当工作簿受密码保护时,可能会发生这种情况。有一些解决方法可以删除此保护,但您在网上找到的大多数示例都已过时。不管怎样,简单的解决方案是手动取消工作簿的保护,否则使用类似OpenXML的东西以编程方式删除保护。

我最近在一个与前面列出的任何答案都不匹配的上下文中看到此错误。事实证明,这是一个冲突。解决方法:暂时禁用AutoVer。

遇到相同问题并找到此线程。除了@Smith在4月17日13日对接受答案的评论外,上述建议都没有任何帮助

我的问题的背景与@zhiyazw的非常接近——基本上是试图在我的案例中设置一个导出的Excel文件SSRS作为dtsx包中的数据源。经过一些修改,我所做的只是重新命名工作表。它不必像@Smith所建议的那样是小写的


我想ACE OLEDB希望Excel文件遵循某种XML结构,但Reporting Services不知何故没有意识到这一点。

该Excel文件地址的扩展名可能不正确。您可以将扩展名从xls更改为xlsx,也可以将扩展名从xlsx更改为xlsx,然后重试。

我最近有此System.Data.OleDb.OLEDBEException 0x80004005:外部表的格式不是预期的格式。发生错误。我依赖于Microsoft Access 2010运行时。在2018年12月12日自动安装到我的服务器上的更新之前,我的C代码使用Microsoft.ACE.OLEDB.12.0 provider运行良好。安装2018年12月12日的更新后,我开始在日志文件中看到“外部表不是预期格式”

我放弃了Microsoft Access 2010运行时并安装了Microsoft Access 2013运行时,我的C代码在没有System.Data.OleDb.OLEDBEException 0x80004005的情况下重新开始工作:外部表不是预期的格式。错误

为我修复此错误的2013版本

2010版,在12月12日自动安装到我的服务器上的更新之前对我有效。


我上个月在一个自动化进程中也发生了此错误。在我运行调试时,C代码运行正常。我发现运行该代码的服务帐户还需要对C:\Windows\Temp文件夹的权限。

如果该文件是只读的,只需将其删除,它就会再次工作。

我遇到了相同的问题。使用这些解决了这个问题步骤:

1.单击“文件”

2.选择另存为

3.单击下拉菜单“另存为类型”

4.选择Excel 97-2003工作簿

5.点击保存按钮


我的工作范围包括下载模板,并在模板中填充数据时验证模板 所以

1下载一个带有标题行的template.xlsx文件。该文件是使用openxml生成的,工作正常

2上载同一文件,但不更改其下载状态。这将导致连接错误,并且无法通过OLEDB连接读取excel工作表

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

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


下载带有首选文件类型的excel有什么想法吗?

使用一些旧代码时,遇到了相同的一般异常。很难追踪这个问题,所以我想我应该在这里添加,以防它对其他人有所帮助

在我的例子中,在OleDbConnection尝试打开文件之前,项目中的其他地方有代码在Excel文件上打开StreamReader,这是在基类中完成的


因此,基本上我只需要首先调用StreamReader对象上的Close,然后我就可以成功打开OleDb连接。它与Excel文件本身无关,也与我首先看到的OleDb连接字符串无关。

我知道这是一篇非常古老的文章,但我也可以就我如何无法解决此问题

我还使用Microsoft.ACE.OLEDB.12.0作为提供程序。 当我的代码试图读取XLSX文件时,收到错误消息,外部表不是预期的格式。 然而,当我在Excel中打开文件,然后代码试图读取它时,它工作了

解决方案: 我将Office 365用于公司文档,在我的案例中,解决方案非常简单,我只需要禁用文档的敏感度,将其设置为public。 细节:即使保存为公共,绿色支票仍然在内部使用中标记,但问题仍然解决了


具有讽刺意味的是,我从其他人的应用程序抄写员那里收到了此错误,但解释仍然为我解决了问题:另存为Excel 97-2003,错误已修复。您可能必须首先安装此错误:这可能令人难以置信,但我只是将工作表名称更改为全小写,并使用sheet1$I'm

使用LinqToExcel,为了让LinqToExcel使用该查询字符串,我必须将该文件重命名为xlsx。所讨论的电子表格实际上是excel 97电子表格,但odbc提供商似乎并不关心这一点。一旦我欺骗LinqToExcel使用正确的查询字符串,提供者显然会决定如何独立于文件扩展名读取文件。“在我的情况下有一个方便的漏洞。@Smith这不是难以置信的,因为任何时候你打开一个文件并进行任何更改,格式都会得到纠正。”。只有在您能够控制正在使用的文件时,它才有帮助。如果你的应用程序从随机用户那里接收文件,那么你仍然被卡住。我已经安装了ACE引擎,但是我需要知道我需要在我的项目中包含哪些引用,以便我的安装程序包含它。并非所有安装我的应用程序的计算机都必须安装MS Office。该链接现在会显示一条错误消息-很抱歉,此下载不再可用。仅供参考:如果您试图在未安装Jet OleDb的PC上打开.xls文件,则会引发OLEDBEException。@Trex您确定最后一行代码正确吗?您能在某个编辑器中再次检查它吗?Excel互操作不是推荐的使用Excel的方法。虽然这是一篇老文章,但我同意MaxOvrdrv,使用互操作不是一个好主意,应该避免,如果不是因为其他原因,它需要在服务器上完全安装Excel。你绝对不应该这样做。我发现只需转到程序和功能并修复ACE就更容易了。对我来说,ACE被命名为Microsoft Access Runtime 2016。我假设我遇到了这个问题的变体,修复只是为我重置了所有注册表项,而不必费心处理regedit;-。事实并非如此。这个问题仍然可能发生,我还没有找到原因,因为我的文件都来自excel 2007,其中一些可以正常工作,而另一些则不能。你有这个说法的来源吗?我不了解自己,只是想知道-这也是我的情况,但是我的文件实际上是一个XML。尽管如此,知道如何使用OBDC导入还是很好的,但我不认为@DavidRogers,我见过类似XML ODBC驱动程序的东西,但从未使用过,你可以看看。同样的情况下,我猜魔法开始于用记事本打开文件,事实上,我投票给你的答案,因为我直到现在才向下滚动查看你的帖子,现在我已经用Html Agility pack打开了文件/解析了它。。。但是你的答案应该排在第一位,从逻辑上讲:首先打开文件!看看里面是否有Excel风格的文件!如果是html文件,只需应用扩展属性,如:extendedproperties=html Import;HDR=否;IMEX=1I遇到的表格问题与预期格式不同。我验证了我的工作簿没有隐藏的工作表。工作簿中的实际工作表名称是大写的,但使用C代码来解析我添加的文件。非常感谢。您不应该在回答中提问,如果您需要问题的答案,请在需要时单独提问。FWIW我在excel工作表中收到此信息,在尝试打开它时,我使用的是当前ACE和建议的扩展属性。当我手动打开文件时,它在顶部有一个启用编辑的提示,我需要找出如何自动翻转该位,但是如果你得到这个提示,你可能只需要打开文件,然后启用编辑。我可能会看看我是否可以以只读方式打开文件,我在这篇文章中看到了一些关于这个的东西。嘘!甚至不应该考虑恢复到过时的文件格式。在作出这一答复时,97-2003格式已有16年历史,过时12年。我可以理解几年,但超过十年的过时不应该向专业开发人员建议文件格式需要更旧。你不知道我已经为此奋斗了多久,原来从我们的应用程序导出的XLSX文件只是重命名为HTML文件。非常感谢。
Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"
        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();