Excel “Dış tablo beklenen biçimde değil.”


162

Aşağıda gösterilen kodu kullanarak bir Excel (xlsx) dosyasını okumaya çalışıyorum. "Dış tablo beklenen biçimde değil." dosyayı zaten Excel'de açmadıkça hata. Başka bir deyişle, C # programımdan okuyabilmem için önce dosyayı Excel'de açmam gerekiyor. Xlsx dosyası ağımızdaki bir paylaşımda. Önce açmak zorunda kalmadan dosyayı nasıl okuyabilirim? Teşekkürler

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 Bunu bir excel sayfasında aldım, açmaya çalışırken, mevcut ACE'yi ve önerilen genişletilmiş özellikleri kullanıyordum. Dosyayı manuel olarak açtığımda, düzenlemeyi etkinleştirmek için üstte o istemi vardı, o biti otomatik olarak nasıl çevireceğimizi sıralamam gerekiyor, ancak bunu alıyorsanız dosyayı açmanız ve ardından düzenlemeyi etkinleştirmeniz gerekebilir . Ben dosyayı salt okunur açabilir, ben çok bu konuda bu konu çok aşağı bir şey gördüm görmek için bakabilirsiniz.
Jeff Patton

Yanıtlar:


246

"Dış tablo beklenen biçimde değil." genellikle aşağıdakileri kullanan bir bağlantı dizesiyle Excel 2007 dosyasını kullanmaya çalışırken oluşur: Microsoft.Jet.OLEDB.4.0 ve Extended Properties = Excel 8.0

Aşağıdaki bağlantı dizesini kullanmak çoğu sorunu çözmektedir.

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
İronik bir şekilde, bu hatayı bir başkasının uygulamasından (Scribe) aldım, ancak açıklama hala benim için sorunu çözdü: "Farklı Kaydet" Excel 97-2003 ve hata düzeltildi.
Jeff Davis

4
.xlsx veya .xls uzantisi?
FAtBalloon

3
önce bunu yüklemeniz gerekebilir: microsoft.com/en-us/download/confirmation.aspx?id=23734
rovsen

11
Bu inanılmaz olabilir, ama ben sadece tüm küçük harf için sayfa adını değiştirmek ve sheet1 $ kullanın
Smith

3
LinqToExcel kullanıyorum ve bu sorgu dizesini kullanmak için LinqToExcel almak için, xlsx için dosyayı yeniden adlandırmak zorunda. Söz konusu e-tablo gerçekten bir excel 97 e-tablosu, ancak odbc sağlayıcısı bunu umursamıyor gibi görünüyor. LinqToExcel'i doğru sorgu dizesini kullanarak kandığımda, Sağlayıcı, dosyanın uzantısından bağımsız olarak dosyanın nasıl okunacağını belirler. Benim durumumda uygun boşluk.
Tim Coker

26

Bu kod için teşekkürler :) Gerçekten takdir ediyorum. Benim için çalışıyor.

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

Excel dosyasının diff sürümüne sahipseniz, dosya adını alın, uzantısı .xlsx ise , bunu kullanın:

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

ve .xls ise , şunu kullanın:

Private Const connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" + path + ";Extended Properties=""Excel 8.0;HDR=YES;"""

5
Bilginize: Jet OleDb yüklü .xlsolmayan bir bilgisayarda bir dosyayı açmaya çalışırsanız bu bir OleDbException oluşturur .
jp2code

@Trex son kod satırınızın doğru olduğundan emin misiniz? Tekrar bazı editörlerde tekrar kontrol edebilir misiniz?
Jogi

15

(Yorum yapmak için çok düşük bir itibarım var, ancak bu, JoshCaba'nın Excel 2007 için Jet yerine Ace-engine kullanarak girişi hakkında yorum)

Makinenizde Ace yüklü / kayıtlı değilse, şu adresten alabilirsiniz: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Excel 2010 için de geçerlidir.


Yüklü ACE motorum var, ancak yükleyicimin onu içermesi için projeme hangi referans II'nin dahil edilmesi gerektiğini bilmem gerekiyor. Uygulamamın yüklü olduğu tüm makinelerde MS Office yüklü olmayabilir.
jp2code

1
Bağlantı şimdi bir hata mesajı veriyor - We're sorry, this download is no longer available.
RBT

9

Sadece davamı ekle. Benim xls dosya bir web sitesinden bir veri verme işlevi tarafından oluşturuldu, dosya uzantısı xls, normalde MS Excel 2003 tarafından açılabilir. Ancak Microsoft.Jet.OLEDB.4.0 ve Microsoft.ACE.OLEDB.12.0 hem bir " Dış tablo beklenen biçimde değil "istisnası.

Son olarak, sorun, istisnanın dediği gibi, "beklenen biçimde değil" dir. Genişletme adı xls olsa da, bir metin düzenleyicisiyle açtığımda, aslında iyi biçimlendirilmiş bir html dosyası, tüm veriler <table>, her <tr> bir satır ve her <td> bir hücre. Sonra bir html şekilde ayrıştırabilir düşünüyorum.


Bu benim durumumdu, ancak dosyam aslında bir XML idi. Yine de OBDC kullanarak nasıl içe aktarılacağını bilmek güzel olurdu, ancak desteklendiğini
David Rogers

@DavidRogers, XML ODBC Sürücüsü gibi bir şey gördüm, ama hiç kullanmadıysanız, cdata.com/drivers/xml/odbc adresine bir göz atın .
Joseph Ding

Burada da aynı şekilde, sihir dosyayı not defteri ile açmaya başladı, aslında cevabınızı yukarı oyluyorum çünkü şimdiye kadar gönderinizi görmek için aşağı kaydırmadım (ve şimdi dosyayı açtım / ayrıştırdım) Html Agility paketi ile ...) ama cevabınız en üstte olmayı hak ediyor, saf mantıkla: ÖNCE DOSYAYI AÇIN! ve içinde bazı Excel-ish dosya tarzı olup olmadığını görün!
Gabriel G

Bir html dosyasıysa, aşağıdaki gibi genişletilmiş özellikleri uygulayın:Extended Properties=""HTML Import;HDR=No;IMEX=1
Nepaluz

4

Ben de aynı problemi yaşadım. bu adımları kullanarak çözüldü:

1.) Dosya'yı tıklayın

2.) "Farklı kaydet" i seçin

3.) Açılır menüyü tıklayın (Kayıt türü)

resim açıklamasını buraya girin

4.) Excel 97-2003 Çalışma Kitabını seçin

resim açıklamasını buraya girin

5.) Kaydet düğmesine tıklayın

resim açıklamasını buraya girin


1
Boo! Güncel olmayan bir dosya biçimine dönmek bile dikkate alınmamalıdır. Bu cevap sırasında 97-2003 formatı 16 yaşında ve 12 yaşındaydı. Birkaç yıl anlayabilirdim, ancak on yıldan fazla bir süredir profesyonel bir geliştiriciye dosya biçiminin daha eski olması gerektiğini önermemelidir.
Lemiarty

3

Aynı sorunu (ACE.OLEDB kullanarak) vardı ve benim için ne çözdü bu bağlantı oldu:

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

Bunun özü, birden çok ofis sürümünün ve çeşitli ofis sdk'nin, derlemelerinin vb. Yüklenmesinin, kayıt defterinde OFFICE12 klasörünü gösteren OFFICE12 klasörüne işaret eden ACEOleDB.dll referansına yol açmış olmasıdır.

C: \ Program Dosyaları \ Ortak Dosyalar \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

Bağlantıdan:

Alternatif olarak, dll yolunu Access sürümünüzle eşleşecek şekilde değiştiren kayıt defteri anahtarını değiştirebilirsiniz.

Access 2007, OFFICE12, Access 2010 - OFFICE14 ve Access 2013 - OFFICE15'i kullanmalıdır

(İS: 64 bit Ofis: 64 bit) veya (İS: 32 bit Ofis: 32 bit)

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

Değer Adı: (Varsayılan)

Değer Verisi: C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(İS: 64 bit Ofis: 32 bit)

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

Değer Adı: (Varsayılan)

Değer Verisi: C: \ Program Dosyaları (x86) \ Ortak Dosyalar \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL


Programlar ve Özellikler ve Onarım ACE'ye gitmeyi daha kolay buldum. (Benim için ACE, Microsoft Access Runtime 2016 olarak adlandırılmıştır). Ben sorunun bu varyant sahip olduğunu varsayalım ve Tamir sadece regedit ;-) ile uğraşmak zorunda kalmadan benim için tüm kayıt defteri anahtarlarını sıfırlayın.
binki

2

Ayrıca, içe aktarılan sayfada karmaşık INDIRECT () formüllerini kullanmaya çalışırken bu hatayı gördüm. Bunu fark ettim çünkü bu, birinin içe aktarıldığı ve diğerinin olmadığı iki çalışma kitabı arasındaki tek farktı. Her ikisi de 2007+ .XLSX dosyalarıydı ve 12.0 motoru kuruldu.

Sorunun bu olduğunu doğruladım:

  • Dosyanın bir kopyasını oluşturma (yine de sorun vardı, bu nedenle farklı kaydetme farkı değildi)
  • Dolaylı formüllerle sayfadaki tüm hücreleri seçme
  • Yalnızca Değerler olarak yapıştırma

ve hata kayboldu.


2

XLSX çalışma kitabının üçüncü taraf ve Oledb okumasında hata alıyordum. Sorun, hataya neden olan gizli bir çalışma sayfası gibi görünüyor. Çalışma sayfasının gizlenmesi, çalışma kitabının içe aktarılmasını sağlamıştır.


2

Dosya salt okunursa, dosyayı kaldırın ve yeniden çalışmalıdır.


1

Aynı konuya rastladı ve bu konuyu buldu. Yukarıdaki önerilerin hiçbiri @ Smith'in 17 Nisan 13'te kabul edilen cevaba yaptığı yorum haricinde yardımcı olmadı.

Sorunumun arka planı @ zhiyazw's kadar yakın - temelde dtsx paketindeki veri kaynağı olarak dışa aktarılan bir Excel dosyasını (benim durumumda SSRS) ayarlamaya çalışıyor. Tüm yaptığım, etrafta dolaştıktan sonra, çalışma sayfasını yeniden adlandırmaktı. @Smith'in önerdiği gibi küçük harf olması gerekmez.

ACE OLEDB, Excel dosyasının belirli bir XML yapısını izlemesini beklediğini, ancak Reporting Services'ın bunun farkında olmadığına inanıyorum.


Tablonun aynı sayısında beklenen biçimde karşılaşmadım. Çalışma kitabımda gizli sayfa olmadığını doğruladım. Çalışma kitabındaki gerçek çalışma sayfası adı büyük harfle yazılır, ancak C # kodunda dosyayı ayrıştırmak için .ToLower () sekme adı için ekledim ve şimdi excel dosyasını tekrar ayrıştırabilirim. TEŞEKKÜR EDERİM!
vvvv4d

1

Bu excel dosya adresinin yanlış bir uzantısı olabilir. Uzantıyı xls yerine xlsx olarak değiştirebilir veya tam tersini yapabilirsiniz.


0

Dosya başka bir işlem tarafından kilitli olabilir, daha sonra kopyalamak bu söylediği gibi yük gerekmez yazı



0

Bu konuya benim çözümümü ekliyorum. Web sunucusuna bir .xlsx dosyası yüklüyordum, ondan okuyordum ve SQL Server'a toplu olarak ekliyordum. Aynı hata mesajını alıyordum, önerilen tüm cevapları denedim ama hiçbiri işe yaramadı. Sonunda dosyayı çalıştı excel 97-2003 (.xls) olarak kaydetti ... şimdi sadece orijinal dosya 110.000 + satırları vardı sorunu.


0

Hâlâ bu sorun varsa, izinlerinizi kontrol edin, bu önerilerin çoğunu denedim ve somut sorunum, işlemek istediğim dosyanın kaynak kontrolü altında olması ve iş parçacığının izinleri olmamasıydı, tüm klasör izinlerini değiştirmek zorunda kaldım ve çalışmaya başladı (Ben orada birçok dosya işliyordum) ... Ayrıca dosyanın adını değiştirmek veya dosyanın başka bir işlem tarafından yaladı olmadığını kontrol gibi birçok öneri ile eşleşir.

Umarım sana yardımcı olur.


0

Ben bu sorunu vardı ve Genişletilmiş Özellikleri HTML İthalat değiştirme Marcus Miris tarafından bu yazı başına düzeltildi :

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

0

OleDb yerine, Excel Birlikte Çalışma özelliğini kullanabilir ve çalışma sayfasını salt okunur olarak açabilirsiniz.

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


5
Excel birlikte çalışma yöntemi Excel ile çalışmak için önerilen bir yöntem değildir. Birçok soruna neden olabilir ve bu nedenle önerilmemelidir.
MaxOvrdrv

Bu eski bir yazı olmasına rağmen, MaxOvrdrv ile hemfikirim, birlikte çalışma özelliğini kullanmak iyi bir fikir değildir ve sunucuda Excel'in tam olarak yüklenmesini gerektirmiyorsa, kaçınılmalıdır.
Lemiarty

Bunu kesinlikle yapmamalısınız.
sovemp

0

ACE, JET'in yerini aldı

Ace Office'in önceki tüm sürümlerini destekler

Bu Kod iyi çalışıyor!

        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
O değil. Sorun hala ortaya çıkabilir, henüz nedenleri bulamadım, çünkü dosyalarım excel 2007'den ve bazıları çalışıyor, bazıları çalışmıyor.
Henrik

Bu iddia için bir kaynağınız var mı? Kendimi tanımıyorum, sadece merak ediyorum. :-)
midoriha_senpai

0

Bu, çalışma kitabı parola korumalı olduğunda oluşabilir. Bu korumayı kaldırmak için bazı geçici çözümler vardır, ancak çevrimiçi olarak bulabileceğiniz örneklerin çoğu eski. Her iki durumda da, basit çözüm, çalışma kitabının korumasını el ile kaldırmaktır, aksi takdirde korumayı programlı olarak kaldırmak için OpenXML gibi bir şey kullanın.


0

Kısa bir süre önce bu hatayı daha önce listelenen cevaplardan hiçbiriyle eşleşmeyen bir bağlamda gördüm. AutoVer ile bir çatışma olduğu ortaya çıktı . Çözüm: AutoVer'i geçici olarak devre dışı bırakın.


0

Geçenlerde bu "System.Data.OleDb.OleDbException (0x80004005): Dış tablo beklenen biçimde değil." hata oluşur. Microsoft Access 2010 Çalışma Zamanı'na güveniyordum. 12 Aralık 2018'de sunucuma otomatik olarak yüklenen güncellemeden önce C # kodum Microsoft.ACE.OLEDB.12.0 sağlayıcısı kullanılarak sorunsuz çalıştı. 12 Aralık 2018 tarihli güncelleştirme yüklendikten sonra günlük dosyamda "Dış tablo beklenen biçimde değil" almaya başladım.

Microsoft Access 2010 Çalışma Zamanı'nı sildim ve Microsoft Access 2013 Çalışma Zamanı'nı yükledim ve C # kodum, "System.Data.OleDb.OleDbException (0x80004005): Yeniden dış tablo beklenen biçimde değil." hatalar.

Bu hatayı benim için düzelten 2013 sürümü https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

12 Aralık'ta sunucuma otomatik olarak yüklenen güncellemeden önce benim için çalışan 2010 sürümü. https://www.microsoft.com/tr-tr/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910

Ben de geçen ay otomatik bir süreçte bu hata oluştu. Ben hata ayıklama koştu C # kodu iyi koştu. Kodu çalıştıran hizmet hesabının da C: \ Windows \ Temp klasörü için izinlere ihtiyacı olduğunu gördüm.


0

Kapsamım şablon indirme işleminden oluşur ve şablon veri ile doldurulduğunda doğrular.

1) Başlık satırını içeren bir şablon (.xlsx) dosyası indirin. dosya openxml kullanılarak oluşturulur ve mükemmel çalışır.

2) Aynı dosyayı, indirme durumunda herhangi bir değişiklik yapmadan yükleyin. Bu bir bağlantı hatasına neden olur ve başarısız olur (OLEDB bağlantısı excel sayfasını okumak için kullanıyor).

Burada veri doldurulursa program beklendiği gibi çalışır.

Sorunun oluşturduğumuz dosyayla bağlantılı olduğu konusunda bir fikre sahip olan herkes, dosyayı açar ve sadece excel formatına dönüştürdüğümüzde xml formatındadır ve iyi çalışır.

Excel'i tercih edilen dosya türüyle indirmek için herhangi bir fikriniz var mı?


cevaplarınızda soru sormamalısınız, sorunuzun cevaplarına ihtiyacınız varsa, gerekirse ayrı olarak sorun.
Abhishek Garg

0

Bazı eski kodlarla çalışmak ve aynı genel istisna ile karşılaştı. Sorunu takip etmek çok zor, bu yüzden başka birine yardımcı olması durumunda buraya ekleyeceğimi düşündüm.

Benim durumumda, OleDbConnection dosyayı açmaya çalışmadan önce Excel dosyasında bir StreamReader açan projenin başka bir yerinde kod vardı (bu bir temel sınıfta yapıldı).

Temelde ilk önce sadece Close()StreamReader nesnesini çağırmak gerekiyordu , o zaman OleDb Bağlantısını başarıyla açabildim. Excel dosyasının kendisi veya OleDbConnection dizesi (doğal olarak ilk baktığım yer) ile ilgisi yoktu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.