Excel “Внешняя таблица не в ожидаемом формате”.
-
16-09-2019 - |
Вопрос
Я пытаюсь прочитать файл Excel (xlsx), используя код, показанный ниже.Я получаю сообщение "Внешняя таблица не в ожидаемом формате". ошибка, если только у меня уже не открыт файл в Excel.Другими словами, я должен сначала открыть файл в Excel, прежде чем смогу прочитать if из моей программы на 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);
}
Решение
"Внешняя таблица не в ожидаемом формате". обычно возникает при попытке использовать файл Excel 2007 со строкой подключения, которая использует:Microsoft.Jet.OLEDB.4.0 и расширенные свойства = 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;";
Поэтому, если у вас разная версия файла 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-engine вместо Jet для Excel 2007)
Если на вашем компьютере не установлен / не зарегистрирован Ace, вы можете получить его по адресу: https://www.microsoft.com/en-US/download/details.aspx?id=13255
Это применимо и к Excel 2010.
Просто добавьте мой случай.Мой файл xls был создан функцией экспорта данных с веб-сайта, расширение файла - xls, обычно его можно открыть в MS Excel 2003.Но как Microsoft.Jet.OLEDB.4.0, так и Microsoft.ACE.OLEDB.12.0 получили исключение "Внешняя таблица не в ожидаемом формате".
Наконец, проблема в том, что, как сказано в исключении, "это не в ожидаемом формате".Хотя это расширение называется xls, но когда я открываю его с помощью текстового редактора, на самом деле это хорошо сформированный HTML-файл, все данные находятся в a <table>, каждый <tr> представляет собой строку и каждый <td> это клетка.Тогда я думаю, что смогу разобрать это в формате html.
У меня была такая же проблема (с использованием ACE.OLEDB), и то, что решило ее для меня, было этой ссылкой:
http://support.microsoft.com/kb/2459087
Суть этого заключается в установке нескольких версий office и различных office sdk, сборок и т.д.привело к появлению ACEOleDB.dll ссылки в реестре, указывающей на папку OFFICE12 вместо OFFICE14 в
C:\Program Файлы\Общие файлы\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 Файлы\Общие файлы\Microsoft Shared\OFFICE14\ACEOLEDB.DLL
(ОС:64- битный Офис:32 бит)
Клавиша:HKCR\Wow6432Node\CLSID{3BE786A0-0366-4F5C-9434-25CF162E475E}\InprocServer32\
Имя значения:(По умолчанию)
Данные о значении:C:\Program Файлы (x86)\Общие файлы\Microsoft Shared\OFFICE14\ACEOLEDB.DLL
Я также видел эту ошибку при попытке использовать сложные формулы INDIRECT() на импортируемом листе.Я заметил это, потому что это было единственное различие между двумя рабочими книгами, где одна импортировалась, а другая нет.Оба были файлами 2007 + .XLSX, и был установлен движок 12.0.
Я подтвердил, что это была проблема, написав:
- Создание копии файла (проблема все еще была, так что это не было какой-то разницей в сохранении как)
- Выделение всех ячеек на листе с непрямыми формулами
- Вставка только в виде значений
и ошибка исчезла.
Я получал ошибки при чтении рабочей книги XLSX третьей стороной и Oledb.Похоже, проблема заключается в скрытом рабочем листе, который вызывает ошибку.Отображение рабочего листа позволило импортировать рабочую книгу.
У меня была эта проблема, и изменение расширенных свойств на HTML Import устранило ее в соответствии с это сообщение Маркуса Мириса:
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & importedFilePathAndName _
& ";Extended Properties=""HTML Import;HDR=No;IMEX=1"";"
Вместо OleDb вы могли бы использовать взаимодействие с Excel и открыть рабочий лист только для чтения.
Столкнулся с той же проблемой и нашел эту тему.Ни одно из приведенных выше предложений не помогло, за исключением комментария @Smith к принятому ответу от 17 '13 апреля.
Предыстория моей проблемы достаточно близка к проблеме @zhiyazw - в основном я пытаюсь установить экспортированный файл Excel (SSRS в моем случае) в качестве источника данных в пакете dtsx.Все, что я сделал, после некоторой возни, это переименовал рабочий лист.Оно не обязательно должно быть строчным, как предложил @Smith.
Я полагаю, что ACE OLEDB ожидает, что файл Excel будет соответствовать определенной структуре XML, но каким-то образом службы Reporting Services не знают об этом.
Этот адрес файла Excel может иметь неправильное расширение.Вы можете изменить расширение с xls на xlsx или наоборот и повторить попытку.
Если файл доступен только для чтения, просто удалите его, и он снова заработает.
файл может быть заблокирован другим процессом, вам нужно скопировать его, а затем загрузить, как указано в этом Публикация
Это также может быть файл, содержащий изображения или диаграммы, смотрите Здесь: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format
Рекомендуется сохранить как Excel 2003
Просто добавляю свое решение к этой проблеме.Я загружал файл .xlsx на веб-сервер, затем считывал из него данные и массово вставлял в SQL Server.Получал это же сообщение об ошибке, перепробовал все предложенные ответы, но ни один из них не сработал.В конце концов я сохранил файл как excel 97-2003 (.xls), который сработал...единственная проблема, с которой я столкнулся сейчас, заключается в том, что в исходном файле было более 110 000 строк.
Если у вас все еще есть эта проблема, проверьте свои разрешения, я перепробовал многие из этих предложений, и моя конкретная проблема заключалась в том, что файл, который я хотел обработать, находился под управлением версиями, а у потока не было разрешений, мне пришлось изменить разрешения для всей папки, и это начало работать (я обрабатывал там много файлов)...Это также соответствует многим предложениям, таким как изменение имени файла или проверка того, что файл не заблокирован другим процессом.
Я надеюсь, что это поможет вам.
ЭЙС вытеснил ДЖЕТА
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();
Это может произойти, если рабочая книга защищена паролем.Существует несколько обходных путей для устранения этой защиты, но большинство примеров, которые вы найдете в Интернете, устарели.В любом случае, простым решением является снятие защиты с рабочей книги вручную, в противном случае используйте что-то вроде OpenXML для программного снятия защиты.
Недавно я увидел эту ошибку в контексте, который не соответствовал ни одному из ранее перечисленных ответов.Оказалось , что это был конфликт с АвтоВер.Обходной путь:временно отключите автозапуск.
Недавно у меня было это "System.Data.Исключение OleDb.OleDbException (0x80004005):Внешняя таблица не в ожидаемом формате ". возникает ошибка.Я полагался на среду выполнения Microsoft Access 2010.До обновления, которое было автоматически установлено на моем сервере 12 декабря 2018 года, мой код на C # работал нормально с использованием поставщика Microsoft.ACE.OLEDB.12.0.После установки обновления от 12 декабря 2018 года я начал получать сообщение “Внешняя таблица не в ожидаемом формате" в моем файле журнала.
Я отключил среду выполнения Microsoft Access 2010 и установил среду выполнения Microsoft Access 2013, и мой код 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 emp.
Моя область действия состоит из загрузки шаблона и проверяет шаблон, когда он заполнен данными Итак,
1) Загрузите файл шаблона (.xlsx) со строкой заголовка.файл генерируется с помощью openxml и это работает безукоризненно.
2) Загрузите тот же файл без каких-либо изменений по сравнению с его загруженным состоянием.Это вызовет ошибку подключения и завершится сбоем (подключение OLEDB используется для чтения листа Excel).
Здесь, если данные заполнены, программа работает должным образом.
У кого-нибудь есть идея, что проблема связана с файлом, в котором мы его создаем xml формат, если мы откроем его и просто сохраним, преобразуем в формат Excel, и он будет работать хорошо.
Есть идеи загрузить excel с предпочтительным типом файла?
Работал с каким-то старым кодом и наткнулся на то же самое общее исключение.Очень трудно отследить проблему, поэтому я подумал, что добавлю здесь на случай, если это поможет кому-то еще.
В моем случае в другом месте проекта был код, который открывал программу StreamReader в файле Excel до того, как OleDbConnection попытался открыть файл (это было сделано в базовом классе).
Так что, по сути, мне просто нужно было позвонить Close()
сначала на объекте StreamReader, затем я смог успешно открыть OleDb-соединение.Это не имело никакого отношения ни к самому файлу Excel, ни к строке OleDbConnection (на которую, естественно, я смотрел в первую очередь).