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.
2016-01-22 12:25
У меня такая же проблема. который решен с помощью этих шагов: 1.) Нажмите Файл 2.) Выберите "Сохранить как" 3.) Нажмите на выпадающее меню (Сохранить как тип)
4.) Выберите книгу Excel 97-2003
5.) Нажмите на кнопку Сохранить У меня была та же самая проблема (Используя ACE.OLEDB), и что решило это для меня, была эта ссылка: http://support.microsoft.com/kb/2459087 Суть в том, что установка нескольких версий Office и различных офисных SDK, сборок и т. Д. Привела к тому, что ссылка ACEOleDB.dll в реестре указывает на папку OFFICE12 вместо OFFICE14 в
По ссылке:
Если файл только для чтения, просто удалите его, и он должен снова работать. Я знаю, что это очень старый пост, но я также могу внести свой вклад в то, как мне удалось решить эту проблему. Я также использую «Microsoft.ACE.OLEDB.12.0» в качестве поставщика. Когда мой код попытался прочитать файл XLSX, он получил сообщение об ошибке «Внешняя таблица не соответствует ожидаемому формату». Однако, когда я оставил файл открытым в Excel, а затем код попытался его прочитать... это сработало. РЕШЕНИЕ: я использую Office 365 с документами компании, и в моем случае решение было очень простым, мне просто нужно было отключить конфиденциальность документа, установив для него статус «общедоступный». Деталь: Даже после сохранения как «общедоступного» зеленая галочка все еще оставалась отмеченной в «Внутреннем использовании», но после этого проблема оставалась решенной. Я также видел эту ошибку при попытке использовать сложные формулы INDIRECT() на импортируемом листе. Я заметил это, потому что это было единственное различие между двумя книгами, в которые импортировалась одна, а другой - нет. Оба были 2007+ .XLSX файлами, и был установлен механизм 12.0. Я подтвердил, что это проблема:
и ошибка исчезла. Я получал ошибки при чтении книги XLSX сторонней организацией и Oledb. Похоже, что это скрытый лист, который вызывает ошибку. Раскрытие листа позволило импортировать книгу. ACE заменил JETAce поддерживает все предыдущие версии Office Этот кодекс работает хорошо!
Наткнулся на ту же проблему и нашел эту ветку. Ни одно из предложенных выше предложений не помогло, за исключением комментария @Smith к принятому ответу 17 апреля 13 года. История моей проблемы достаточно близка к @zhiyazw - в основном я пытаюсь установить экспортированный файл Excel (в моем случае SSRS) в качестве источника данных в пакете dtsx. Все, что я сделал после некоторого возни, переименовал лист. Это не должно быть в нижнем регистре, как предложил @Smith. Я предполагаю, что ACE OLEDB ожидает, что файл Excel будет следовать определенной структуре XML, но каким-то образом службы Reporting Services не знают об этом. Этот адрес файла Excel может иметь неправильное расширение. Вы можете изменить расширение с xls на xlsx или наоборот и попробовать еще раз. У меня была эта проблема, и изменение расширенных свойств на импорт HTML устранило ее в соответствии с этой записью Маркуса Мириса:
Вместо OleDb вы можете использовать Excel Interop и открыть лист только для чтения. Это случилось с нами совсем недавно. Наш клиент получал эту ошибку при попытке загрузить свой файл Excel на наш веб-сайт. Я могу открыть файл xlsx в MS Excel и не вижу никаких нарушений в файле. Я пробовал все упомянутые здесь решения, и ни одно из них не сработало. И я нашел эту ссылку Обработка данных как текста с использованием Microsoft.ACE.OLEDB.12.0 . В нашем случае сработало добавление атрибута IMEX=1 в строку подключения. Поэтому, если вы используете Microsoft ACE OLEDB 12.0, это может помочь решить вашу проблему. Надеюсь это поможет.
Я недавно видел эту ошибку в контексте, который не соответствовал ни одному из ранее перечисленных ответов. Оказалось, конфликт с 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 попытался открыть файл (это было сделано в базовом классе). Так что мне просто нужно было позвонить Если у вас все еще есть эта проблема, то проверьте свои разрешения, я попробовал многие из этих предложений, и моя конкретная проблема заключалась в том, что файл, который я хотел обработать, находился под контролем исходного кода, а поток не имел разрешений, мне пришлось изменить разрешения для всей папки. и он начал работать (я там обрабатывал много файлов)... Он также соответствует многим предложениям, таким как изменение имени файла или проверка того, что файл не заблокирован другим процессом. Я надеюсь, что это поможет вам. Моя область действия состоит из загрузки шаблона и проверки шаблона, когда он заполнен данными. Итак, 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. Файл может быть заблокирован другим процессом, вам нужно скопировать его и загрузить, как сказано в этом посте |