Чтение файлов.xls (97-2003) с помощью ACE после сопоставления с ними в Excel 2013

Мы использовали Access Database Engine 2010 (V.14.0.4763.1000) для чтения файлов Excel (97-2003) .xls из C# (.Net framework 4.0) с успешными результатами в течение очень долгого времени. Но теперь, после открытия файлов в 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 повреждает файловую структуру 97-2003 таким образом, что ACE не понимает. Есть ли способ, как мы можем решить эту проблему?

Просто чтобы быть ясно, формат файла, который нам нужно прочитать, всегда.xls (97-2003), мы не хотим читать файлы.xlsx (мы можем сделать это без проблем), но нам нужно использовать (97- 2003) для совместимости с другими системами.

Редактировать:

Я сделал очень простую тестовую программу для иллюстрации, вы можете получить ее здесь: https://www.dropbox.com/s/1ftw3emilnbuw6t/ExcelTest.rar

Файл.rar содержит:

  • ExcelReadingTest.exe (Программа)
  • Program.cs (исходный код)
  • SavedFromExcel2007.xls (пример файла Excel, сохраненного из Excel 2007 в формате 97-2003)
  • SavedFromExcel2013.xls (тот же файл Excel, сохраненный из Excel 2013 в формате 97-2003)

Для запуска примера сохраните все файлы в каталоге 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...

0 ответов

Другие вопросы по тегам