Excel "Внешняя таблица не в ожидаемом формате."

Я пытаюсь прочитать файл 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);
}

26 ответов

Решение

"Внешняя таблица не в ожидаемом формате." обычно возникает при попытке использовать файл 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;";

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

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;"""

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

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

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

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

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

, каждый является строкой, а каждый
является клетка. Тогда я думаю, что я могу разобрать его в формате HTML.

У меня такая же проблема. который решен с помощью этих шагов:

1.) Нажмите Файл

2.) Выберите "Сохранить как"

3.) Нажмите на выпадающее меню (Сохранить как тип)

4.) Выберите книгу Excel 97-2003

5.) Нажмите на кнопку Сохранить

У меня была та же самая проблема (Используя 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-разрядная версия Office: 64-разрядная) или (ОС: 32-разрядная версия Office: 32-разрядная)

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

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

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

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

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

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

Данные значения: C:\Program Files (x86)\ Общие файлы \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

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

Я знаю, что это очень старый пост, но я также могу внести свой вклад в то, как мне удалось решить эту проблему.

Я также использую «Microsoft.ACE.OLEDB.12.0» в качестве поставщика. Когда мой код попытался прочитать файл XLSX, он получил сообщение об ошибке «Внешняя таблица не соответствует ожидаемому формату». Однако, когда я оставил файл открытым в Excel, а затем код попытался его прочитать... это сработало.

РЕШЕНИЕ: я использую Office 365 с документами компании, и в моем случае решение было очень простым, мне просто нужно было отключить конфиденциальность документа, установив для него статус «общедоступный». Деталь: Даже после сохранения как «общедоступного» зеленая галочка все еще оставалась отмеченной в «Внутреннем использовании», но после этого проблема оставалась решенной.

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

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

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

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

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

ACE заменил JET

Ace поддерживает все предыдущие версии Office

Этот кодекс работает хорошо!

        OleDbConnection MyConnection;
        DataSet DtSet;
        OleDbDataAdapter MyCommand;

        MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\\Book.xlsx;Extended Properties=Excel 12.0;");
        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
        DtSet = new System.Data.DataSet();

        MyCommand.Fill(DtSet);
        dataGridView1.DataSource = DtSet.Tables[0];
        MyConnection.Close();

Наткнулся на ту же проблему и нашел эту ветку. Ни одно из предложенных выше предложений не помогло, за исключением комментария @Smith к принятому ответу 17 апреля 13 года.

История моей проблемы достаточно близка к @zhiyazw - в основном я пытаюсь установить экспортированный файл Excel (в моем случае SSRS) в качестве источника данных в пакете dtsx. Все, что я сделал после некоторого возни, переименовал лист. Это не должно быть в нижнем регистре, как предложил @Smith.

Я предполагаю, что ACE OLEDB ожидает, что файл Excel будет следовать определенной структуре XML, но каким-то образом службы Reporting Services не знают об этом.

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

У меня была эта проблема, и изменение расширенных свойств на импорт HTML устранило ее в соответствии с этой записью Маркуса Мириса:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
         & ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"

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

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

Это случилось с нами совсем недавно. Наш клиент получал эту ошибку при попытке загрузить свой файл Excel на наш веб-сайт. Я могу открыть файл xlsx в MS Excel и не вижу никаких нарушений в файле. Я пробовал все упомянутые здесь решения, и ни одно из них не сработало. И я нашел эту ссылку Обработка данных как текста с использованием Microsoft.ACE.OLEDB.12.0 . В нашем случае сработало добавление атрибута IMEX=1 в строку подключения. Поэтому, если вы используете Microsoft ACE OLEDB 12.0, это может помочь решить вашу проблему. Надеюсь это поможет.

      <add name="ExcelTextConnection" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR={1};IMEX=1'" />

Я недавно видел эту ошибку в контексте, который не соответствовал ни одному из ранее перечисленных ответов. Оказалось, конфликт с AutoVer. Обходной путь: временно отключите AutoVer.

Просто добавляю мое решение этой проблемы. Я загружал файл.xlsx на веб-сервер, затем читал с него и массово вставлял в SQL Server. Получал то же самое сообщение об ошибке, пробовал все предложенные ответы, но ни один не работал. В конце концов я сохранил файл как excel 97-2003 (.xls), который сработал... единственная проблема, которая у меня возникла сейчас, заключается в том, что исходный файл имел более 110 000 строк.

Это может произойти, если рабочая книга защищена паролем. Есть некоторые обходные пути для удаления этой защиты, но большинство примеров, которые вы найдете в сети, устарели. В любом случае, простое решение состоит в том, чтобы снять защиту рабочей книги вручную, в противном случае используйте что-то вроде OpenXML для программного удаления защиты.

У меня это происходило на веб-сайте IIS, который я размещаю, редко, но периодически эта ошибка появляется для файлов, которые я ранее хорошо анализировал. Простой перезапуск соответствующего пула приложений, похоже, решает проблему. Хотя не совсем понятно, почему...

Это также может быть файл, содержащий изображения или диаграммы, см. Это: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format

Рекомендуется сохранить как Excel 2003

Работая с некоторым более старым кодом, я обнаружил то же общее исключение. Очень сложно отследить проблему, поэтому я подумал, что добавлю сюда, если это поможет кому-то другому.

В моем случае в другом месте проекта был код, который открывал StreamReader в файле Excel до того, как OleDbConnection попытался открыть файл (это было сделано в базовом классе).

Так что мне просто нужно было позвонить Close()сначала на объекте StreamReader, тогда я смогу успешно открыть соединение OleDb. Это не имело ничего общего ни с самим файлом Excel, ни со строкой OleDbConnection (которую я, естественно, сначала искал).

Если у вас все еще есть эта проблема, то проверьте свои разрешения, я попробовал многие из этих предложений, и моя конкретная проблема заключалась в том, что файл, который я хотел обработать, находился под контролем исходного кода, а поток не имел разрешений, мне пришлось изменить разрешения для всей папки. и он начал работать (я там обрабатывал много файлов)... Он также соответствует многим предложениям, таким как изменение имени файла или проверка того, что файл не заблокирован другим процессом.

Я надеюсь, что это поможет вам.

Моя область действия состоит из загрузки шаблона и проверки шаблона, когда он заполнен данными. Итак,

1) Загрузите файл шаблона (.xlsx) со строкой заголовка. файл создается с использованием openxml, и он работает отлично.

2) Загрузить тот же файл без каких-либо изменений из его загруженного состояния. Это приведет к ошибке соединения и не удастся (соединение OLEDB используется для чтения таблицы Excel).

Здесь, если данные заполнены, программа работает как положено.

Любой, у кого есть идея, связана с файлом, который мы создаем, в формате xml, если мы откроем его и просто сохраним, преобразуем его в формат Excel, и он работает хорошо.

Любая идея скачать Excel с предпочтительным типом файла?

У меня недавно было это "System.Data.OleDb.OleDbException (0x80004005): внешняя таблица не в ожидаемом формате". ошибка произошла. Я полагался на Microsoft Access 2010 Runtime. До обновления, которое было автоматически установлено на моем сервере 12 декабря 2018 года, мой код C# работал нормально с использованием поставщика Microsoft.ACE.OLEDB.12.0. После установки обновления от 12 декабря 2018 года я начал получать "Внешняя таблица не в ожидаемом формате" в моем файле журнала.

Я отключил Microsoft Access 2010 Runtime и установил Microsoft Access 2013 Runtime, и мой код C# снова начал работать без "System.Data.OleDb.OleDbException (0x80004005): внешняя таблица не в ожидаемом формате". ошибки.

Версия 2013 года, которая исправила эту ошибку для меня https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

Версия 2010, которая работала для меня до обновления, которое было автоматически установлено на моем сервере 12 декабря. https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910

Я также имел эту ошибку в прошлом месяце в автоматизированном процессе. Код C# работал нормально, когда я запускал его отладку. Я обнаружил, что учетной записи службы, выполняющей код, также необходимы разрешения для папки C:\Windows\Temp.

Файл может быть заблокирован другим процессом, вам нужно скопировать его и загрузить, как сказано в этом посте

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