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

Я пытаюсь прочитать файл Excel (xlsx), используя приведенный ниже код. Я получаю "Внешняя таблица не в ожидаемом формате". если я не открываю файл в Excel. Другими словами, я должен сначала открыть файл в Excel, прежде чем я смогу прочитать, если из моей программы на С#. Файл 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);
}

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Если у вас не установлен/зарегистрирован Ace на вашем компьютере, вы можете получить его по адресу: https://www.microsoft.com/en-US/download/details.aspx?id=13255

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

Ответ 4

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

Наконец, проблема в том, что, как сказано в исключении, "это не в ожидаемом формате". Хотя имя расширения является xls, но когда я его открываю текстовым редактором, это фактически хорошо сформированный html файл, все данные находятся в таблице <table> , каждый <tr> представл ет собой строку и каждый <td> является ячейкой. Тогда я думаю, что могу разобрать его по html-способу.

Ответ 5

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

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

Суть его в том, что установка нескольких офисных версий и различных офисных sdk, сборок и т.д. привела к ссылке ACEOleDB.dll в реестре, указывающей на папку OFFICE12 вместо OFFICE14 в

C:\Program Files\Общие файлы \Microsoft Shared\OFFICE14\ACEOLEDB.DLL

Из ссылки:

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

Доступ 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 Общий \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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

enter image description here

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

enter image description here

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

enter image description here

Ответ 10

У меня возникла эта проблема и изменение расширенных свойств на HTML Import зафиксировал ее как this сообщение от Marcus Miris:

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

Ответ 11

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

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 16

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

Ответ 17

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

Надеюсь, это вам поможет.

Ответ 18

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();

Ответ 19

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

Ответ 20

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

Ответ 21

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

Я отключил Microsoft Access 2010 Runtime и установил Microsoft Access 2013 Runtime, и мой код С# снова начал работать без "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:\Windows\Temp.

Ответ 22

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

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

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

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

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

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