1

我们一直在使用 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。我们使用以下连接字符串来读取文件:

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

where{0}替换为文件名和路径。Excel 2013 似乎以某种 ACE 无法理解的方式破坏了 97-2003 文件结构。我们有什么办法可以解决这个问题吗?

需要说明的是,我们需要读取的文件格式始终是 .xls (97-2003),我们不想读取 .xlsx 文件(我们可以毫无问题地这样做),但我们需要使用 (97- 2003)与其他系统的兼容性。

编辑:

我做了一个很简单的测试程序来说明,你可以在这里获取: https ://www.dropbox.com/s/1ftw3emilnbuw6t/ExcelTest.rar

.rar 文件包含:

  • ExcelReadingTest.exe(程序)
  • Program.cs(源代码)
  • SavedFromExcel2007.xls(从 Excel 2007 以 97-2003 格式保存的示例 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...

如果您键入:

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

您将在安装 Access Database Engine 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 Database Engine 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...
4

0 回答 0