Excel "Tabel eksternal tidak dalam format yang diharapkan."

162

Saya mencoba membaca file Excel (xlsx) menggunakan kode di bawah ini. Saya mendapatkan "Tabel eksternal tidak dalam format yang diharapkan." kesalahan kecuali saya memiliki file sudah terbuka di Excel. Dengan kata lain, saya harus membuka file di Excel terlebih dahulu sebelum saya dapat membaca jika dari program C # saya. File xlsx berbagi di jaringan kami. Bagaimana saya bisa membaca file tanpa harus membukanya terlebih dahulu? Terima kasih

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);
}
Sisiutl
sumber
FWIW Saya menerima ini pada lembar excel, ketika mencoba membukanya, saya menggunakan ACE saat ini dan properti tambahan yang disarankan. Ketika saya membuka file secara manual, ada prompt di bagian atas untuk mengaktifkan pengeditan, saya perlu memilah cara membalikkan bit itu secara otomatis, tetapi jika Anda mendapatkan ini, Anda mungkin hanya perlu membuka file, dan kemudian mengaktifkan pengeditan. . Saya mungkin melihat apakah saya dapat membuka file read-only, saya melihat sesuatu yang sangat jauh di utas ini tentang itu.
Jeff Patton

Jawaban:

246

"Tabel eksternal tidak dalam format yang diharapkan." biasanya terjadi ketika mencoba menggunakan file Excel 2007 dengan string koneksi yang menggunakan: Microsoft.Jet.OLEDB.4.0 dan Extended Properties = Excel 8.0

Menggunakan string koneksi berikut tampaknya memperbaiki sebagian besar masalah.

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;";
FAtBalloon
sumber
10
Ironisnya, saya menerima kesalahan ini dari aplikasi orang lain (Scribe), tetapi penjelasannya masih memecahkan masalah bagi saya: "Save As" Excel 97-2003, dan kesalahan diperbaiki.
Jeff Davis
4
ekstensi .xlsx atau .xls?
FAtBalloon
3
Anda mungkin harus menginstal ini terlebih dahulu: microsoft.com/en-us/download/confirmation.aspx?id=23734
rovsen
11
ini mungkin tidak bisa dipercaya, tetapi saya cukup mengubah nama sheet menjadi huruf kecil semua dan menggunakan sheet1 $
Smith
3
Saya menggunakan LinqToExcel, dan untuk mendapatkan LinqToExcel untuk menggunakan string kueri itu, saya harus mengganti nama file menjadi xlsx. Spreadsheet yang dimaksud benar-benar merupakan spreadsheet excel 97, tetapi penyedia odbc tampaknya tidak peduli tentang itu. Setelah saya mengelabui LinqToExcel agar menggunakan string kueri yang benar, Penyedia tampaknya menentukan cara membaca file terlepas dari ekstensi file. Celah yang nyaman dalam kasus saya.
Tim Coker
26

Terima kasih untuk kode ini :) Saya sangat menghargainya. Bekerja untukku.

public static string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

Jadi jika Anda memiliki versi berbeda dari file Excel, dapatkan nama file, jika ekstensinya adalah .xlsx , gunakan ini:

Private Const connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

dan jika .xls , gunakan:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""
Trex
sumber
5
FYI: Ini akan melempar OleDbException jika Anda mencoba untuk membuka .xlsfile di PC yang tidak memiliki Jet OleDb diinstal di dalamnya.
jp2code
@ Trx Anda yakin baris kode terakhir sudah benar? Bisakah Anda periksa kembali di beberapa editor lagi?
Jogi
15

(Saya memiliki reputasi yang terlalu rendah untuk berkomentar, tetapi ini adalah komentar pada entri JoshCaba, menggunakan mesin Ace bukannya Jet untuk Excel 2007)

Jika Anda tidak memiliki Ace yang diinstal / terdaftar pada mesin Anda, Anda bisa mendapatkannya di: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Ini berlaku untuk Excel 2010 juga.

cederlof
sumber
Saya sudah menginstal mesin ACE, tetapi saya perlu tahu referensi II apa yang perlu dimasukkan dalam proyek saya sehingga installer saya memasukkannya. Tidak semua mesin tempat aplikasi saya diinstal akan menginstal MS Office.
jp2code
1
Tautan sekarang memberikan pesan kesalahan - We're sorry, this download is no longer available.
RBT
9

Tambahkan saja case saya. File xls saya dibuat oleh fungsi ekspor data dari sebuah situs web, ekstensi file adalah xls, biasanya dapat dibuka oleh MS Excel 2003. Tetapi Microsoft.Jet.OLEDB.4.0 dan Microsoft.ACE.OLEDB.12.0 mendapat " Tabel eksternal tidak dalam pengecualian format yang diharapkan ".

Akhirnya, masalahnya adalah, seperti perkecualian mengatakan, "itu tidak dalam format yang diharapkan". Meskipun nama ekstensi adalah xls, tetapi ketika saya membukanya dengan editor teks, itu sebenarnya file html yang terbentuk dengan baik, semua data berada dalam <tabel>, masing-masing <tr> adalah baris dan setiap <td> adalah sel. Maka saya pikir saya dapat menguraikannya dengan cara html.

Joseph Ding
sumber
Ini adalah kasus saya juga, namun file saya sebenarnya XML. Tetap menyenangkan mengetahui cara mengimpornya menggunakan OBDC, tapi saya rasa tidak didukung.
David Rogers
@ DavidRogers, saya pernah melihat sesuatu seperti Driver XML ODBC, tetapi tidak pernah digunakan, Anda telah melihat cdata.com/drivers/xml/odbc .
Joseph Ding
Sama halnya di sini, saya kira keajaiban mulai membuka file dengan notepad, sebenarnya saya memilih-up jawaban Anda karena saya tidak gulir ke bawah untuk melihat posting Anda sampai sekarang (dan sekarang saya sudah membuka file / menguraikannya dengan paket Html Agility ...) tetapi jawaban Anda layak berada di atas, dengan logika murni: BUKA FILE PERTAMA! dan lihat apakah ada gaya file Excel-ish di dalamnya!
Gabriel G
Jika ini file html, cukup terapkan properti yang diperluas seperti:Extended Properties=""HTML Import;HDR=No;IMEX=1
Nepaluz
4

Saya memiliki masalah yang sama. yang telah diselesaikan menggunakan langkah-langkah ini:

1.) Klik File

2.) Pilih "simpan sebagai"

3.) Klik pada drop down (Simpan sebagai tipe)

masukkan deskripsi gambar di sini

4.) Pilih Buku Kerja Excel 97-2003

masukkan deskripsi gambar di sini

5.) Klik pada tombol Simpan

masukkan deskripsi gambar di sini

Kamran
sumber
1
Boo! Mengembalikan ke format file yang sudah usang seharusnya tidak menjadi pertimbangan. Pada saat jawaban ini, format 97-2003 berusia 16 tahun dan 12 tahun kedaluwarsa. Saya bisa mengerti beberapa tahun, tetapi lebih dari satu dekade kedaluwarsa seharusnya tidak menyarankan kepada pengembang profesional bahwa format file harus lebih lama.
Lemiarty
3

Saya memiliki masalah yang sama (Menggunakan ACE.OLEDB) dan apa yang mengatasinya bagi saya adalah tautan ini:

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

Inti dari itu adalah bahwa menginstal beberapa versi kantor dan berbagai kantor sdk, majelis, dll. Telah mengarah ke referensi ACEOleDB.dll dalam registri yang menunjuk ke folder OFFICE12 alih-alih OFFICE14 di

C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

Dari tautan:

Atau, Anda dapat memodifikasi kunci registri untuk mengubah jalur dll agar sesuai dengan versi Access Anda.

Access 2007 harus menggunakan OFFICE12, Access 2010 - OFFICE14 dan Access 2013 - OFFICE15

(OS: 64bit Office: 64bit) atau (OS: 32bit Office: 32bit)

Kunci: HKCR \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

Nama Nilai: (Default)

Value Data: C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(OS: 64bit Office: 32bit)

Kunci: HKCR \ Wow6432Node \ CLSID {3BE786A0-0366-4F5C-9434-25CF162E475E} \ InprocServer32 \

Nama Nilai: (Default)

Nilai Data: C: \ Program Files (x86) \ File Umum \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

jordanhill123
sumber
Saya merasa lebih mudah untuk hanya pergi ke Program dan Fitur dan Perbaikan ACE. (Bagi saya, ACE bernama Microsoft Access Runtime 2016). Saya berasumsi bahwa saya mengalami varian masalah ini dan Perbaikan hanya mereset semua kunci registri untuk saya tanpa saya harus repot dengan regedit ;-).
binki
2

Saya juga melihat kesalahan ini ketika mencoba menggunakan rumus INDIRECT () kompleks pada lembar yang sedang diimpor. Saya perhatikan ini karena ini adalah satu-satunya perbedaan antara dua buku kerja di mana satu mengimpor dan yang lainnya tidak. Keduanya adalah file 2007+ .XLSX, dan mesin 12.0 diinstal.

Saya mengkonfirmasi ini adalah masalah dengan:

  • Membuat salinan file (masih ada masalah, jadi itu bukan perbedaan simpan-sebagai)
  • Memilih semua sel dalam lembar dengan rumus Tidak Langsung
  • Menempel sebagai Nilai saja

dan kesalahan itu hilang.

John M. Black
sumber
2

Saya mendapatkan kesalahan dengan pihak ketiga dan Oledb membaca buku kerja XLSX. Masalahnya tampaknya lembar kerja tersembunyi yang menyebabkan kesalahan. Melonggarkan lembar kerja memungkinkan buku kerja untuk mengimpor.

John M
sumber
2

Jika file hanya-baca, hapus saja dan itu akan berfungsi lagi.

Naskah
sumber
1

Berlari ke masalah yang sama dan menemukan utas ini. Tidak ada saran di atas yang membantu kecuali untuk komentar @ Smith untuk jawaban yang diterima pada 17 April13.

Latar belakang masalah saya cukup dekat dengan @ zhiyazw - pada dasarnya mencoba mengatur file Excel yang diekspor (SSRS dalam kasus saya) sebagai sumber data dalam paket dtsx. Semua yang saya lakukan, setelah bermain-main, mengganti nama lembar kerja. Tidak harus huruf kecil seperti yang disarankan @Smith.

Saya kira ACE OLEDB mengharapkan file Excel mengikuti struktur XML tertentu tetapi entah bagaimana Layanan Pelaporan tidak menyadarinya.

kerwei
sumber
Saya mengalami masalah yang sama tabel tidak dalam format yang diharapkan. Saya memverifikasi buku kerja saya tidak memiliki lembar tersembunyi. Nama lembar kerja aktual dalam buku kerja ditulis dengan huruf besar tetapi dalam kode C # untuk mem-parsing file yang saya tambahkan .ToLower () untuk nama tab dan sekarang saya dapat mem-parsing file excel lagi. TERIMA KASIH!
vvvv4d
1

Alamat file excel itu mungkin memiliki ekstensi yang salah. Anda dapat mengubah ekstensi dari xls ke xlsx atau sebaliknya dan coba lagi.

Mohammad Fathi MiMFa
sumber
0

file mungkin dikunci oleh proses lain, Anda perlu menyalinnya lalu memuatnya seperti yang dikatakan dalam posting ini

pengguna3140982
sumber
0

Hanya menambahkan solusi saya untuk masalah ini. Saya sedang mengunggah file .xlsx ke server web, lalu membaca darinya dan memasukkannya secara massal ke SQL Server. Sedang mendapatkan pesan kesalahan yang sama ini, mencoba semua jawaban yang disarankan tetapi tidak ada yang berhasil. Akhirnya saya menyimpan file sebagai excel 97-2003 (.xls) yang berfungsi ... satu-satunya masalah yang saya miliki sekarang adalah file aslinya memiliki 110.000 baris.

Kieran Quinn
sumber
0

Jika Anda masih memiliki masalah ini, kemudian periksa izin Anda, saya mencoba banyak saran ini dan masalah konkret saya adalah bahwa file yang ingin saya proses berada di bawah kendali sumber dan utas tidak memiliki izin, saya harus mengubah seluruh izin folder. dan mulai bekerja (saya sedang memproses banyak file di sana) ... Ini juga cocok dengan banyak saran seperti mengubah nama file atau memeriksa bahwa file tersebut tidak dirusak oleh proses lain.

Saya harap ini membantu Anda.

Juan
sumber
0

Saya punya masalah ini dan mengubah Extended Properties ke HTML Impor memperbaikinya sesuai posting ini oleh Marcus Miris:

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

Alih-alih OleDb, Anda bisa menggunakan Interop Excel dan membuka lembar kerja sebagai hanya-baca.

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

Nelson
sumber
5
Excel interop bukan metode yang disarankan untuk bekerja dengan Excel. Itu dapat menyebabkan banyak masalah dan karenanya tidak direkomendasikan.
MaxOvrdrv
Meskipun ini adalah posting lama, saya setuju dengan MaxOvrdrv, menggunakan interop bukanlah ide yang baik dan harus dihindari, jika tanpa alasan lain maka diperlukan penginstalan lengkap Excel di server.
Lemiarty
Anda benar-benar tidak boleh melakukan ini.
sovemp
0

ACE telah Mengawasi JET

Ace Mendukung semua versi Office sebelumnya

Kode ini berfungsi dengan baik!

        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();
Akshay Upadhyay
sumber
1
Itu tidak. Masalahnya masih dapat terjadi, saya belum menemukan alasannya, karena semua file saya berasal dari excel 2007, dan beberapa di antaranya berfungsi, beberapa di antaranya tidak.
Henrik
Apakah Anda memiliki sumber untuk klaim itu? Saya sendiri tidak tahu, hanya ingin tahu. :-)
midoriha_senpai
0

Ini bisa terjadi ketika buku kerja dilindungi kata sandi. Ada beberapa solusi untuk menghapus perlindungan ini, tetapi sebagian besar contoh yang Anda temukan online sudah usang. Apa pun caranya, solusi sederhana adalah membuka proteksi workbook secara manual, jika tidak gunakan sesuatu seperti OpenXML untuk menghapus proteksi secara terprogram.

KthProg
sumber
0

Baru-baru ini saya melihat kesalahan ini dalam konteks yang tidak cocok dengan jawaban yang tercantum sebelumnya. Itu ternyata konflik dengan AutoVer . Penanganan masalah: untuk sementara menonaktifkan AutoVer.

unbob
sumber
0

Baru-baru ini saya memiliki "System.Data.OleDb.OleDbException (0x80004005): Tabel eksternal tidak dalam format yang diharapkan." kesalahan terjadi. Saya mengandalkan Microsoft Access 2010 Runtime. Sebelum pembaruan yang diinstal secara otomatis di server saya pada 12 Desember 2018, kode C # saya bekerja dengan baik menggunakan penyedia Microsoft.ACE.OLEDB.12.0. Setelah pembaruan dari 12 Desember 2018 diinstal saya mulai mendapatkan "Tabel eksternal tidak dalam format yang diharapkan" dalam file log saya.

Saya membuang Microsoft Access 2010 Runtime dan menginstal Microsoft Access 2013 Runtime dan kode C # saya mulai berfungsi lagi tanpa "System.Data.OleDb.OleDbException (0x80004005): Tabel eksternal tidak dalam format yang diharapkan." kesalahan.

Versi 2013 yang memperbaiki kesalahan ini untuk saya https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

Versi 2010 yang bekerja untuk saya sebelum pembaruan yang diinstal secara otomatis di server saya pada 12 Desember. https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910

Saya juga mengalami kesalahan ini bulan lalu dalam proses otomatis. Kode C # berjalan dengan baik ketika saya menjalankannya debugging. Saya menemukan bahwa akun layanan yang menjalankan kode juga memerlukan izin untuk folder C: \ Windows \ Temp.

vvvv4d
sumber
0

Lingkup saya terdiri dari pengunduhan templat dan verifikasi templat saat diisi dengan data. Jadi,

1) Unduh file templat (.xlsx) dengan baris tajuk. file dihasilkan menggunakan openxml dan berfungsi dengan baik.

2) Unggah file yang sama tanpa perubahan apa pun dari status unduhannya. Ini akan menyebabkan kesalahan koneksi dan gagal (koneksi OLEDB digunakan untuk membaca lembar excel).

Di sini jika data diisi, program bekerja seperti yang diharapkan.

Siapa pun yang memiliki ide masalah terhubung dengan file yang kami buat itu dalam format xml jika kami membukanya dan hanya menyimpannya dikonversi ke format excel dan berfungsi dengan baik.

Adakah gagasan untuk mengunduh excel dengan jenis file yang disukai?

Thomson Kattingal
sumber
Anda seharusnya tidak mengajukan pertanyaan dalam jawaban Anda, jika Anda membutuhkan jawaban untuk pertanyaan Anda, tanyakan secara terpisah jika diperlukan.
Abhishek Garg
0

Bekerja dengan beberapa kode lama dan menemukan pengecualian umum yang sama. Sangat sulit untuk melacak masalahnya, jadi saya pikir saya akan menambahkan di sini kalau-kalau itu membantu orang lain.

Dalam kasus saya, ada kode di tempat lain dalam proyek yang membuka StreamReader pada file Excel sebelum OleDbConnection mencoba membuka file (ini dilakukan dalam kelas dasar).

Jadi pada dasarnya saya hanya perlu memanggil Close()objek StreamReader terlebih dahulu, kemudian saya bisa membuka Koneksi OleDb dengan sukses. Itu tidak ada hubungannya dengan file Excel itu sendiri, atau dengan string OleDbConnection (yang secara alami di mana saya melihat pada awalnya).

tulang T
sumber