在使用Excel 2013对其进行操作后,使用ACE读取.xls(97-2003)文件

我们一直在使用Access Database Engine 2010(V.14.0.4763.1000)从c#(.Net framework 4.0)中读取Excel(97-2003).xls文件,并取得了很长时间的成功。 但是,现在,在使用Excel 2013打开文件并以相同格式(97-2003 .xls)再次保存文件后,我们无法再读取这些文件。

它给了我们以下错误:

外部表格不是预期的格式。

当我们使用Excel 2007或2010打开和保存文件时,这种情况不会发生,只能在2013年。我们使用以下连接string来读取文件:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0;HDR=YES 

其中{0}被文件名和pathreplace。 看来Excel 2013以某种ACE不理解的方式破坏了97-2003文件结构。 有什么办法可以解决这个问题吗?

要清楚的是,我们需要读取的文件格式总是.xls(97-2003),我们不想读取.xlsx文件(我们可以做到这一点没有问题),但我们需要使用(97- 2003)与其他系统兼容。

编辑:

我做了一个非常简单的testing程序来说明,你可以在这里得到它: https : //www.dropbox.com/s/1ftw3emilnbuw6t/ExcelTest.rar

.rar文件包含:

  • ExcelReadingTest.exe(本程序)
  • Program.cs(源代码)
  • SavedFromExcel2007.xls(以97-2003格式从Excel 2007保存的示例Excel文件)
  • SavedFromExcel2013.xls(与Excel 2013以97-2003格式保存的Excel文件相同)

要运行该示例,请保存c:\ temp中的所有文件,然后在cmd控制台上键入:

 C:\>cd c:\temp (Enter) C:\temp>ExcelReadingTest SavedFromExcel2007.xls (Enter) 

你会得到:

 1 Hello 2 World 3 Reading 4 Excel Press Enter... 

如果你input:

 C:\temp>ExcelReadingTest SavedFromExcel2013.xls (Enter) 

你会得到这个安装Access数据库引擎2007年(12.0.6612.1000):

 System.Data.OleDb.OleDbException (0x80040E37): The Microsoft Access database eng ine could not find the object 'Sheet1$'. Make sure the object exists and that yo u spell its name and the path name correctly. If 'Sheet1$' is not a local object , check your network connection or contact the server administrator. en System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResul t hr) en System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARA MS dbParams, Object& executeResult) en System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) en System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Ob ject& executeResult) en System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behav ior, String method) en System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.OleDb.OleDbCommand.ExecuteReader() en ExcelReadingTest.Program.Main(String[] args) Press Enter... 

或者你会得到这与安装Access数据库引擎2010(14.0.7015.1000):

 System.Data.OleDb.OleDbException (0x80004005): External table is not in the expe cted format. at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString cons tr, OleDbConnection connection) at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOpti ons options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection o wningObject) at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbC onnection owningConnection, DbConnectionPoolGroup poolGroup) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection ow ningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection ou terConnection, DbConnectionFactory connectionFactory) at System.Data.OleDb.OleDbConnection.Open() at ExcelReadingTest.Program.Main(String[] args) in c:\users\ivanm\documents\v isual studio 2010\Projects\ExcelReadingTest\ExcelReadingTest\Program.cs:line 41 Press Enter...