Вопрос

Я пытаюсь прочитать файл 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.Похоже, проблема заключается в скрытом рабочем листе, который вызывает ошибку.Отображение рабочего листа позволило импортировать рабочую книгу.

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

1.) Щелкните Файл

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

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

enter image description here

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

enter image description here

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

enter image description here

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

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

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

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

Столкнулся с той же проблемой и нашел эту тему.Ни одно из приведенных выше предложений не помогло, за исключением комментария @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 (на которую, естественно, я смотрел в первую очередь).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top