Excel "Внешняя таблица не в ожидаемом формате." - PullRequest
158 голосов
/ 16 июля 2009

Я пытаюсь прочитать файл Excel (xlsx), используя код, показанный ниже. Я получаю «Внешняя таблица не в ожидаемом формате». ошибка, если у меня нет файла уже открыт в Excel. Другими словами, мне нужно сначала открыть файл в Excel, прежде чем я смогу прочитать его из моей программы на C #. Файл xlsx находится в общем доступе в нашей сети. Как я могу прочитать файл, не открывая его сначала? Спасибо

string sql = "SELECT * FROM [Sheet1$]";
string excelConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathname + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";

using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, excelConnection)) {
    DataSet ds = new DataSet();
    adaptor.Fill(ds);
}

Ответы [ 22 ]

232 голосов
/ 01 сентября 2009

"Внешняя таблица не в ожидаемом формате." обычно возникает при попытке использовать файл Excel 2007 со строкой подключения, которая использует: Microsoft.Jet.OLEDB.4.0 и Extended Properties = Excel 8.0

Использование следующей строки подключения, похоже, решает большинство проблем.

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;";
23 голосов
/ 11 февраля 2010

Спасибо за этот код :) Я действительно ценю это. У меня работает.

public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

Так что, если у вас есть версия diff файла Excel, получите имя файла, если его расширение .xlsx , используйте это:

Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

и, если это .xls , используйте:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""
14 голосов
/ 25 февраля 2011

(у меня слишком низкая репутация, чтобы комментировать, но это комментарий к записи JoshCaba, использующей движок Ace вместо Jet для Excel 2007)

Если на вашем компьютере не установлен / не зарегистрирован Ace, вы можете получить его по адресу: http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en

Это относится и к Excel 2010.

8 голосов
/ 22 января 2016

Просто добавьте мой случай. Мой файл xls был создан функцией экспорта данных с веб-сайта, расширение файла - xls, его обычно можно открыть в MS Excel 2003. Но и Microsoft.Jet.OLEDB.4.0, и Microsoft.ACE.OLEDB.12.0 получили " Внешняя таблица не в ожидаемом формате "исключение.

Наконец, проблема, как и в исключении, «это не в ожидаемом формате». Хотя это расширение имя xls, но когда я открываю его с помощью текстового редактора, это на самом деле правильно сформированный HTML-файл, все данные находятся в

является клетка. Тогда я думаю, что смогу разобрать его в html-формате.
3 голосов
/ 05 июня 2013

У меня была такая же проблема (с использованием ACE.OLEDB), и что для меня решило эту ссылку:

http://support.microsoft.com/kb/2459087

Суть в том, что при установке нескольких версий 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 - OFFICE15

(ОС: 64-разрядная версия: 64-разрядная версия) или (ОС: 32-разрядная версия: 32-разрядная версия)

Ключ: HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

Имя значения: (по умолчанию)

Данные значения: C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(ОС: 64-битная Офис: 32-битная)

Key: HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

Имя значения: (по умолчанию)

Данные значения: C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ Office14 \ ACEOLEDB.DLL

2 голосов
/ 11 мая 2012

Я также видел эту ошибку при попытке использовать сложные формулы INDIRECT () на импортируемом листе. Я заметил это, потому что это было единственное различие между двумя книгами, в которые импортировалась одна, а другой - нет. Оба были 2007+ .XLSX файлами, и был установлен механизм 12.0.

Я подтвердил, что это проблема:

  • Создание копии файла (проблема по-прежнему существовала, так что разница не была сохранена)
  • Выбор всех ячеек на листе с помощью косвенных формул
  • Вставка только в значения

и ошибка исчезла.

2 голосов
/ 04 июля 2014

Я получал ошибки при чтении книги XLSX сторонней организацией и Oledb. Похоже, что это скрытый лист, который вызывает ошибку. Раскрытие листа позволило импортировать книгу.

1 голос
/ 05 февраля 2019

Если файл только для чтения, просто удалите его, и он должен снова работать.

1 голос
/ 16 июля 2009

Вместо OleDb вы можете использовать Excel Interop и открыть лист только для чтения.

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx

1 голос
/ 27 июня 2018

Этот адрес файла Excel может иметь неправильное расширение. Вы можете изменить расширение с xls на xlsx или наоборот и повторить попытку.

...