我们一直使用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
其中{0}
由文件名和路径替换。似乎Excel 2013以某种ACE不理解的方式破坏了97-2003的文件结构。我们有什么方法可以解决这个问题吗?
为了清楚起见,我们需要读取的文件格式总是.xls(97-2003),我们不想读取.xlsx文件(我们可以毫无问题地执行此操作),但我们需要使用(97-2003)与其他系统的兼容性。
编辑:
我做了一个非常简单的测试程序来说明,你可以在这里得到它: https://www.dropbox.com/s/1ftw3emilnbuw6t/ExcelTest.rar
.rar文件包含:
要运行该示例,请保存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...