В 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);
}

18 ответов


"внешняя таблица не в ожидаемом формате."обычно происходит при попытке использовать файл Excel 2007 со строкой подключения, использующей: Microsoft.Реактивный.Oledb для.4.0 и расширенные свойства=Excel 8.0

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

public static string path = @"C:\src\RedirectApplication\RedirectApplication1s.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-engine вместо 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.Реактивный.Oledb для.4.0 и Microsoft.ТУЗ.Oledb для.12.0 получено исключение" внешняя таблица не в ожидаемом формате".

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

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

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

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

суть в том, что установка нескольких версий office и различных Office sdk, сборок и т. д. привел к Ацеоледбу.ссылка dll в реестре, указывающая на папку OFFICE12 вместо OFFICE14 в

C:\Program Файлы\Общие Файлы\Microsoft Общий\OFFICE14\ACEOLEDB.Dll файлы

из ссылки:

кроме того, вы можете изменить раздел реестра, изменив путь dll в соответствии с версией Access.

Access 2007 должен использовать OFFICE12, Access 2010-OFFICE14 и Access 2013-OFFICE15

(ОС: 64-битный офис: 64bit) или (ОС: 32-битный офис: 32бит)

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

Имя Значения: (По Умолчанию)

Значение Данных: C:\Program Файлы\Общие Файлы\Microsoft Общий\OFFICE14\ACEOLEDB.Dll файлы

(OS: 64bit офис: 32bit)

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

Имя Значения: (По Умолчанию)

значение данных: C:\Program файлы (x86)\Общие файлы\Microsoft Общий\OFFICE14\ACEOLEDB.Dll файлы


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

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

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

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


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


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

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


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


Это также может быть файл, содержащий изображения или диаграммы, см. Это: 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+ строк.


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

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


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

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

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

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


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


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

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

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


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