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和Extended Properties=Excel

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


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

“外部表未采用预期格式。”通常在尝试使用连接字符串为Microsoft.Jet.OLEDB.4.0和Extended Properties=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引擎而不是Jet for Excel 2007)

如果您的计算机上没有安装/注册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。收到相同的错误消息时,尝试了所有建议的答案,但均无效。最后,我将文件保存为excel 97-2003(.xls),它可以工作。。。我现在唯一的问题是原始文件有110000多行

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


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

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


我希望它能帮助您。

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

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();

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

我最近看到了这个示例ror的上下文与前面列出的任何答案都不匹配。结果与冲突。解决方法:暂时禁用AutoVer。

遇到同一问题并找到此线程。除了@Smith在2013年4月17日对已接受答案的评论外,上述建议均无效

我的问题的背景与@zhiyazw非常接近-基本上是试图将导出的Excel文件(在我的例子中是SSRS)设置为dtsx包中的数据源。所有
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();