Excel "Зовнішня таблиця не в очікуваному форматі".


162

Я намагаюся прочитати файл 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);
}

FWIW Я отримав це на аркуші Excel, коли намагався відкрити його, я використовував поточний ACE та запропоновані розширені властивості. Коли я вручну відкрив файл, у верхній частині цього запиту було ввімкнено редагування. Мені потрібно розібратися, як автоматично перегортати цей біт, але якщо ви отримуєте це, можливо, потрібно просто відкрити файл, а потім увімкнути редагування . Я можу подивитися, чи зможу я відкрити файл лише для читання, і я побачив щось дуже далеко в цій темі про це.
Джефф Паттон

Відповіді:


246

"Зовнішня таблиця не в очікуваному форматі." зазвичай виникає при спробі використання файлу 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;";

10
За іронією долі, я отримав цю помилку від чужого додатку (Scribe), але пояснення все-таки вирішило для мене проблему: "Зберегти як" Excel 97-2003, і ​​помилка виправлена.
Джефф Девіс

4
.xlsx або .xls розширення?
FAtBalloon

3
вам, можливо, доведеться встановити це спочатку: microsoft.com/en-us/download/confirmation.aspx?id=23734
rovsen

11
це може бути неймовірним, але я просто поміняю назву аркуша на всі малі регістри та використовую sheet1 $
Smith

3
Я використовую LinqToExcel, і щоб змусити LinqToExcel використовувати рядок запиту, я повинен перейменувати файл у xlsx. Розглянута електронна таблиця насправді є електронною таблицею 97, але постачальник odbc, здається, не переймається цим. Як тільки я обманюю LinqToExcel у використанні правильного рядка запиту, Постачальник, очевидно, визначає, як читати файл незалежно від розширення файлу. Зручна лазівка ​​в моєму випадку.
Тім Кокер

26

Дякую за цей код :) Дуже вдячний. Працює для мене.

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

5
FYI: Це викине OleDbException, якщо ви спробуєте відкрити .xlsфайл на ПК, на якому не встановлено Jet OleDb.
jp2code

@Trex Ви впевнені, що ваш останній рядок коду правильний? Чи можете ви повторно перевірити його в якомусь редакторі ще раз?
Jogi

15

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

Якщо у вас на комп'ютері не встановлений / зареєстрований Ace, його можна отримати за посиланням: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Це стосується і Excel 2010.


У мене встановлений двигун ACE, але мені потрібно знати, яку посилання II потрібно включити в мій проект, щоб мій інсталятор включив його. Не на всіх машинах, на яких встановлено моє додаток, обов'язково встановлено MS Office.
jp2code

1
Тепер посилання дає повідомлення про помилку - We're sorry, this download is no longer available.
RBT

9

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

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


Так було і в моєму випадку, проте мій файл насправді був XML. І все-таки було б добре знати, як імпортувати його за допомогою OBDC, але я не думаю, що він підтримується.
Девід Роджерс

@DavidRogers, я коли-небудь бачив щось на кшталт драйвера XML ODBC, але ніколи не використовувався, ви подивіться на cdata.com/drivers/xml/odbc .
Джозеф Дінг

Такий самий випадок і тут, я думаю, що магія почалася з відкриття файлу з блокнотом, адже я голосую на вашу відповідь, тому що я до цього часу не прокручував вниз, щоб побачити вашу публікацію (і тепер я вже відкрив файл / розібрав його з пакетом Html Agility ...), але ваша відповідь заслуговує на те, щоб бути вгорі, за чистою логікою: ВІДКРИТИ ФАЙЛ ПЕРШИМ! і подивіться, чи всередині нього є якийсь стиль файлу Excel!
Габріель Г

Якщо це файл HTML, просто застосуйте розширені властивості так:Extended Properties=""HTML Import;HDR=No;IMEX=1
Nepaluz

4

У мене була така ж проблема. що вирішено за допомогою цих кроків:

1.) Клацніть Файл

2.) Виберіть "зберегти як"

3.) Клацніть на спадному меню (Зберегти як тип)

введіть тут опис зображення

4.) Виберіть робочу книжку Excel 97-2003

введіть тут опис зображення

5.) Натисніть кнопку «Зберегти»

введіть тут опис зображення


1
Бу! Повернення до застарілого формату файлу навіть не повинно враховувати. На момент отримання відповіді формату 97-2003 року було 16 років та 12 років застаріло. Я міг би зрозуміти кілька років, але більш ніж десятиліття застаріло не повинно підказувати професійному розробнику, що формат файлу повинен бути старшим.
Лемярті

3

У мене була ця сама проблема (за допомогою ACE.OLEDB), і це вирішило для мене це посилання:

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

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

C: \ Програмні файли \ Загальні файли \ 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 Files \ Загальні файли \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

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

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

Ім'я значення: (за замовчуванням)

Дані про значення: C: \ Program Files (x86) \ Загальні файли \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL


Мені було легше просто перейти до "Програми та функції" та відновити ACE. (Для мене ACE називається Microsoft Access Runtime 2016). Я припускаю, що у мене був такий варіант проблеми, і Ремонт просто скинув усі реєстрові ключі для мене, не маючи турбуватися з regedit ;-).
бінкі

2

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

Я підтвердив, що це питання було:

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

і помилка зникла.


2

Я отримував помилки під час читання робочої книги XLSX третьою стороною та Оледбом. Видається, що проблема є прихованим робочим аркушем, який спричиняє помилку. Якщо приховувати робочий аркуш, імпорт робочої книги був імпортований.


2

Якщо файл лише для читання, просто видаліть його і він повинен працювати знову.


1

Побіг у тому ж випуску і знайшов цю тему. Жодна з наведених вище пропозицій не допомогла, окрім коментаря @ Сміта до прийнятої відповіді 17 квітня 1313 року.

Фон моєї проблеми досить близький до @ zhiyazw - в основному намагаються встановити експортований файл Excel (в моєму випадку SSRS) як джерело даних у пакеті dtsx. Все, що я зробив, після деяких роздумів, перейменував робочий аркуш. Це не повинно бути малим регістром, як запропонував @Smith.

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


Я зіткнувся з тим же номером таблиці не у очікуваному форматі. Я перевірив, що в моїй книжці немає прихованих аркушів. Фактична назва робочого аркуша в робочій книжці пишеться з великої літери, але в коді C # для аналізу файлу, який я додав. СПАСИБІ!
vvvv4d

1

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




0

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


0

Якщо у вас все-таки виникає ця проблема, то перевірте свої дозволи, я перепробував багато цих пропозицій, і моя конкретна проблема полягала в тому, що файл, який я хотів обробити, знаходився під контролем джерела, а потік не мав дозволів, я повинен був змінити всі дозволи папки. і він почав працювати (я обробляв там багато файлів) ... Він також відповідає багатьом пропозиціям, наприклад, змінити ім'я файлу або перевірити, чи файл не піддається іншим процесам.

Я сподіваюся, що це вам допоможе.


0

У мене виникла ця проблема, і зміна розширених властивостей на імпорт HTML виправила її відповідно до цієї публікації Маркусом Мірісом:

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

0

Замість OleDb можна використовувати Excel Interop та відкривати робочий аркуш як лише для читання.

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


5
Інтероп Excel не є рекомендованим методом роботи з Excel. Це може спричинити багато проблем, а тому не слід рекомендувати.
MaxOvrdrv

Хоча це старе повідомлення, я погоджуюся з MaxOvrdrv, використання interop не є хорошою ідеєю, і його слід уникати, якщо з будь-якої іншої причини, ніж для нього, потрібна повна інсталяція Excel на сервер.
Лемярті

Вам абсолютно не слід цього робити.
совемп

0

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

1
Це не. Проблема все ще може виникнути, я ще не з'ясував, чому, оскільки мої файли - це від excel 2007, а деякі з них працюють, деякі - ні.
Генрік

Чи є у вас джерело для цієї претензії? Я не знаю себе, просто цікаво. :-)
midoriha_senpai

0

Це може статися, коли робоча книга захищена паролем. Існує кілька способів усунення цього захисту, але більшість прикладів, які ви знайдете в Інтернеті, є застарілими. У будь-якому випадку, просте рішення - зняти захист робочої книги вручну, інакше використовувати щось на зразок OpenXML, щоб видалити захист програмно.


0

Нещодавно я побачив цю помилку в контексті, який не відповідав жодній із перерахованих раніше відповідей. Виявився конфлікт з AutoVer . Вирішення: тимчасово вимкнути AutoVer.


0

Нещодавно у мене була ця система "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.


0

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

1) Завантажте шаблон шаблону (.xlsx) із заголовком. файл генерується за допомогою openxml і працює бездоганно.

2) Завантажте той самий файл без змін із завантаженого стану. Це призведе до помилки підключення та не вдається (підключення OLEDB використовується для читання аркуша excel).

Тут, якщо дані заповнені, програма працює як очікувалося.

Кожен, хто має ідею, що проблема пов’язана з файлом, який ми створюємо, це в xml форматі , якщо ми відкриємо його та просто збережемо перетворити його у формат excel, і він добре працює.

Будь-яка ідея завантажити Excel із бажаним типом файлу?


не слід задавати запитання у своїх відповідях, якщо вам потрібні відповіді на своє запитання, задайте їх окремо, якщо потрібно.
Абхішек Гарг

0

Робота з деяким старшим кодом і натрапила на цей самий загальний виняток. Дуже важко простежити проблему, тому я подумав, що додам тут, якщо це допоможе комусь іншому.

У моєму випадку, було код в іншому місці в проекті , який відкривав StreamReader на файл Excel , перш ніж того, як OleDbConnection намагався відкрити файл (це було зроблено в базовому класі).

Тому в основному мені потрібно було спочатку зателефонувати Close()на об'єкт StreamReader, після чого я міг успішно відкрити з'єднання OleDb. Це не мало нічого спільного ні з самим файлом Excel, ні з рядком OleDbConnection (що, природно, там, де я спочатку шукав).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.