Excel "La tabella esterna non è nel formato previsto."


162

Sto cercando di leggere un file Excel (xlsx) utilizzando il codice mostrato di seguito. Ottengo un "Tavolo esterno non è nel formato previsto." errore a meno che il file non sia già aperto in Excel. In altre parole, devo aprire il file in Excel prima di poter leggere se dal mio programma C #. Il file xlsx è su una condivisione sulla nostra rete. Come posso leggere il file senza prima aprirlo? Grazie

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 L'ho ricevuto su un foglio Excel, nel tentativo di aprirlo, stavo usando l'ACE corrente e le proprietà estese suggerite. Quando ho aperto manualmente il file, nella parte superiore c'era quel prompt per abilitare la modifica, ho bisogno di capire come capovolgere automaticamente quel bit, ma se stai ottenendo questo potrebbe essere sufficiente aprire il file e quindi abilitare la modifica . Potrei vedere se riesco ad aprire il file di sola lettura, in questo thread ho visto qualcosa di molto più basso in questo thread.
Jeff Patton,

Risposte:


246

"La tabella esterna non è nel formato previsto." in genere si verifica quando si tenta di utilizzare un file Excel 2007 con una stringa di connessione che utilizza: Microsoft.Jet.OLEDB.4.0 e Proprietà estese = Excel 8.0

L'uso della seguente stringa di connessione sembra risolvere la maggior parte dei problemi.

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
Ironia della sorte, ho ricevuto questo errore dall'applicazione di qualcun altro (Scribe), ma la spiegazione ha ancora risolto il problema per me: "Salva con nome" Excel 97-2003 e l'errore è stato corretto.
Jeff Davis,

4
Estensione .xlsx o .xls?
FAtBalloon,

3
potresti dover installare prima questo: microsoft.com/en-us/download/confirmation.aspx?id=23734
rovsen

11
questo può essere incredibile, ma cambio semplicemente il nome del foglio in tutto minuscolo e uso sheet1 $
Smith

3
Sto usando LinqToExcel e per fare in modo che LinqToExcel utilizzi quella stringa di query, devo rinominare il file in xlsx. Il foglio di calcolo in questione è davvero un foglio di calcolo Excel 97, ma al provider odbc non sembra interessarsene. Una volta indotto LinqToExcel a utilizzare la stringa di query corretta, il Provider a quanto pare determina come leggere il file indipendentemente dall'estensione del file. Scappatoia conveniente nel mio caso.
Tim Coker,

26

Grazie per questo codice :) Lo apprezzo molto. Per me va bene.

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

Quindi, se hai una versione diff del file Excel, ottieni il nome del file, se la sua estensione è .xlsx , usa questo:

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

e se è .xls , usa:

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

5
Cordiali saluti: Questo genererà una OleDbException se si tenta di aprire un .xlsfile su un PC su cui non è installato Jet OleDb.
jp2code

@Trex sei sicuro che l'ultima riga di codice sia corretta? Puoi ricontrollarlo in qualche editor?
Jogi,

15

(Ho una reputazione troppo bassa per commentare, ma questo è un commento sulla voce di JoshCaba, usando il motore Ace invece di Jet per Excel 2007)

Se non hai Ace installato / registrato sul tuo computer, puoi scaricarlo su: https://www.microsoft.com/en-US/download/details.aspx?id=13255

Si applica anche a Excel 2010.


Ho installato il motore ACE, ma devo sapere quale riferimento II deve includere nel mio progetto in modo che il mio installatore lo includa. Non tutte le macchine su cui è installata la mia app avranno necessariamente installato MS Office.
jp2code

1
Il collegamento ora fornisce un messaggio di errore - We're sorry, this download is no longer available.
RBT,

9

Aggiungi il mio caso. Il mio file xls è stato creato da una funzione di esportazione dei dati da un sito Web, l'estensione del file è xls, può essere normalmente aperta da MS Excel 2003. Ma sia Microsoft.Jet.OLEDB.4.0 che Microsoft.ACE.OLEDB.12.0 hanno ottenuto un " La tabella esterna non è nel formato previsto "eccezione.

Infine, il problema è, come diceva l'eccezione, "non è nel formato previsto". Sebbene il suo nome di estensione sia xls, ma quando lo apro con un editor di testo, in realtà è un file html ben formato, tutti i dati sono in un <table>, ogni <tr> è una riga e ogni <td> è un cellula. Quindi penso di poterlo analizzare in modo html.


Anche questo è stato il mio caso, tuttavia il mio file era in realtà un XML. Sarebbe comunque bello sapere come importarlo usando OBDC, ma non credo sia supportato.
David Rogers,

@DavidRogers, ho mai visto qualcosa come XML ODBC Driver, ma mai usato, dai un'occhiata a cdata.com/drivers/xml/odbc .
Joseph Ding,

Stesso caso qui, immagino che la magia abbia iniziato ad aprire il file con il blocco note, in effetti sto votando la tua risposta perché non ho fatto scorrere verso il basso per vedere il tuo post fino ad ora (e ora ho già aperto il file / analizzato con Html Agility pack ...) ma la tua risposta merita di essere al top, per pura logica: APRI IL FILE PER PRIMO! e vedi se al suo interno c'è un po 'di stile file Excel!
Gabriel G,

Se è un file html, applica semplicemente le proprietà estese in questo modo:Extended Properties=""HTML Import;HDR=No;IMEX=1
Nepaluz,

4

Ho avuto lo stesso problema. che come risolto usando questi passaggi:

1.) Fare clic su File

2.) Seleziona "salva con nome"

3.) Fai clic sul menu a discesa (Salva come tipo)

inserisci qui la descrizione dell'immagine

4.) Seleziona cartella di lavoro Excel 97-2003

inserisci qui la descrizione dell'immagine

5.) Fare clic sul pulsante Salva

inserisci qui la descrizione dell'immagine


1
Boo! Il ripristino di un formato di file obsoleto non dovrebbe nemmeno essere considerato. Al momento di questa risposta, il formato 97-2003 aveva 16 anni e 12 anni non aggiornati. Potrei capire alcuni anni, ma più di un decennio non aggiornato non dovrebbe suggerire a uno sviluppatore professionista che il formato del file deve essere più vecchio.
Lemiarty,

3

Ho avuto lo stesso problema (utilizzando ACE.OLEDB) e ciò che lo ha risolto per me è stato questo link:

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

L'essenza di ciò è che l'installazione di più versioni di Office e vari sdk di Office, assiemi, ecc. Aveva portato al riferimento ACEOleDB.dll nel registro che punta alla cartella OFFICE12 anziché OFFICE14 in

C: \ Programmi \ File comuni \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

Dal link:

In alternativa, è possibile modificare la chiave del Registro di sistema modificando il percorso DLL in modo che corrisponda a quello della versione di Access.

Access 2007 dovrebbe usare OFFICE12, Access 2010 - OFFICE14 e Access 2013 - OFFICE15

(Sistema operativo: ufficio a 64 bit: 64 bit) o ​​(Sistema operativo: ufficio a 32 bit: 32 bit)

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

Nome valore: (impostazione predefinita)

Dati valore: C: \ Programmi \ File comuni \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(Sistema operativo: ufficio a 64 bit: 32 bit)

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

Nome valore: (impostazione predefinita)

Dati valore: C: \ Programmi (x86) \ File comuni \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL


Ho trovato più semplice andare su Programmi e funzionalità e riparare ACE. (Per me, ACE si chiama Microsoft Access Runtime 2016). Presumo che stavo avendo questa variante del problema e che Repair mi ha semplicemente ripristinato tutte le chiavi di registro senza che mi dovessi preoccupare di regedit ;-).
binki,

2

Ho anche visto questo errore quando provavo ad usare formule INDIRECT () complesse sul foglio che veniva importato. L'ho notato perché questa era l'unica differenza tra due cartelle di lavoro in cui una importava e l'altra no. Entrambi erano file .XLSX 2007+ ed è stato installato il motore 12.0.

Ho confermato che questo era il problema di:

  • Fare una copia del file (il problema persiste, quindi non era una differenza di salvataggio)
  • Selezione di tutte le celle nel foglio con le formule indirette
  • Incollare solo come valori

e l'errore è scomparso.


2

Stavo riscontrando errori con la lettura di terze parti e Oledb di una cartella di lavoro XLSX. Il problema sembra essere un foglio di lavoro nascosto che causa un errore. Scoprire il foglio di lavoro ha permesso all'importazione della cartella di lavoro.


2

Se il file è di sola lettura, rimuovilo e dovrebbe funzionare di nuovo.


1

Ho riscontrato lo stesso problema e ho trovato questa discussione. Nessuno dei suggerimenti di cui sopra ha aiutato tranne il commento di @ Smith alla risposta accettata il 17 aprile 13.

Lo sfondo del mio problema è abbastanza vicino a quello di @ zhiyazw - fondamentalmente provando a impostare un file Excel esportato (nel mio caso SSRS) come origine dati nel pacchetto dtsx. Tutto quello che ho fatto, dopo aver armeggiato, è stato rinominare il foglio di lavoro. Non deve essere minuscolo come ha suggerito @Smith.

Suppongo che ACE OLEDB si aspetti che il file Excel segua una determinata struttura XML, ma in qualche modo Reporting Services non ne è consapevole.


Mi sono imbattuto nello stesso problema della tabella non nel formato previsto. Ho verificato che la mia cartella di lavoro non avesse fogli nascosti. Il nome effettivo del foglio di lavoro nella cartella di lavoro è scritto in maiuscolo ma nel codice C # per analizzare il file che ho aggiunto .ToLower () per il nome della scheda e ora posso analizzare nuovamente il file Excel. GRAZIE!
vvvv4d,

1

L'indirizzo del file Excel potrebbe avere un'estensione errata. È possibile modificare l'estensione da xls a xlsx o viceversa e riprovare.


0

il file potrebbe essere bloccato da un altro processo, è necessario copiarlo e caricarlo come indicato in questo post



0

Sto solo aggiungendo la mia soluzione a questo problema. Stavo caricando un file .xlsx sul server web, quindi leggendo da esso e inserendo in blocco su SQL Server. Stava ricevendo lo stesso messaggio di errore, ho provato tutte le risposte suggerite ma nessuna ha funzionato. Alla fine ho salvato il file come Excel 97-2003 (.xls) che ha funzionato ... l'unico problema che ho ora è che il file originale aveva oltre 110.000 righe.


0

Se hai ancora questo problema, quindi controlla le tue autorizzazioni, ho provato molti di questi suggerimenti e il mio problema concreto era che il file che volevo elaborare era sotto il controllo del codice sorgente e il thread non aveva autorizzazioni, ho dovuto cambiare le autorizzazioni dell'intera cartella e ha iniziato a funzionare (stavo elaborando molti file lì dentro) ... Corrisponde anche a molti suggerimenti come cambiare il nome del file o verificare che il file non sia laccato da un altro processo.

Spero che ti aiuti.


0

Ho avuto questo problema e cambiando le proprietà estese in HTML Importato risolto come da questo post di Marcus Miris:

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

0

Invece di OleDb, è possibile utilizzare Excel Interop e aprire il foglio di lavoro in sola lettura.

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


5
L'interoperabilità di Excel non è un metodo consigliato per lavorare con Excel. Può causare molti problemi e quindi non dovrebbe essere raccomandato.
MaxOvrdrv

Anche se questo è un vecchio post, sono d'accordo con MaxOvrdrv, l'uso dell'interoperabilità non è una buona idea e dovrebbe essere evitato, se non altro per il fatto che richiede un'installazione completa di Excel sul server.
Lemiarty,

Non dovresti assolutamente farlo.
Sovemp

0

ACE ha superato il JET

Ace Supporta tutte le versioni precedenti di Office

Questo codice funziona bene!

        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
Non è così. Il problema può ancora verificarsi, non ho ancora scoperto perché, poiché i miei file provengono da Excel 2007 e alcuni di essi funzionano, altri no.
Henrik

Hai una fonte per tale affermazione? Non mi conosco, mi chiedo solo. :-)
midoriha_senpai

0

Ciò può verificarsi quando la cartella di lavoro è protetta da password. Esistono alcune soluzioni alternative per rimuovere questa protezione, ma la maggior parte degli esempi che troverai online sono obsoleti. In entrambi i casi, la soluzione semplice è rimuovere la protezione manuale della cartella di lavoro, altrimenti utilizzare qualcosa come OpenXML per rimuovere la protezione a livello di codice.


0

Recentemente ho visto questo errore in un contesto che non corrispondeva a nessuna delle risposte precedentemente elencate. Si è rivelato essere un conflitto con AutoVer . Soluzione alternativa: disabilitare temporaneamente AutoVer.


0

Recentemente ho avuto questo "System.Data.OleDb.OleDbException (0x80004005): tabella esterna non è nel formato previsto." si è verificato un errore. Facevo affidamento su Microsoft Access 2010 Runtime. Prima dell'aggiornamento installato automaticamente sul mio server il 12 dicembre 2018, il mio codice C # funzionava correttamente utilizzando il provider Microsoft.ACE.OLEDB.12.0. Dopo l'installazione dell'aggiornamento dal 12 dicembre 2018, ho iniziato a ottenere la "Tabella esterna non è nel formato previsto" nel mio file di registro.

Ho abbandonato il runtime di Microsoft Access 2010 e ho installato il runtime di Microsoft Access 2013 e il mio codice C # ha ripreso a funzionare senza "System.Data.OleDb.OleDbException (0x80004005): la tabella esterna non è nel formato previsto." errori.

Versione 2013 che ha corretto questo errore per me https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358

Versione 2010 che ha funzionato per me prima dell'aggiornamento che è stato installato automaticamente sul mio server il 12 dicembre. https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910

Ho anche avuto questo errore si è verificato il mese scorso in un processo automatizzato. Il codice C # funzionava bene quando l'ho eseguito il debug. Ho scoperto che l'account del servizio che esegue il codice aveva anche bisogno delle autorizzazioni per la cartella C: \ Windows \ Temp.


0

Il mio ambito è costituito dal download del modello e verifica il modello quando è pieno di dati Quindi,

1) Scarica un file modello (.xlsx) con la riga di intestazione. il file viene generato usando openxml e funziona perfettamente.

2) Carica lo stesso file senza alcuna modifica dal suo stato scaricato. Ciò causerà un errore di connessione e non riuscirà (la connessione OLEDB sta usando per leggere il foglio Excel).

Qui se i dati sono riempiti il ​​programma funziona come previsto.

Chiunque abbia idea che il problema sia connesso al file che stiamo creando è in formato XML se lo apriamo e salviamo semplicemente convertiamo in formato Excel e funziona bene.

Qualche idea per scaricare Excel con il tipo di file preferito?


non dovresti porre domande nelle tue risposte, se hai bisogno di risposte alle tue domande, chiedile separatamente se necessario.
Abhishek Garg,

0

Lavorando con un codice precedente e ho riscontrato la stessa eccezione generica. Molto difficile rintracciare il problema, quindi ho pensato di aggiungere qui nel caso in cui aiuti qualcun altro.

Nel mio caso, c'era altro codice nel progetto che stava aprendo uno StreamReader sul file Excel prima che OleDbConnection tentasse di aprire il file (ciò è stato fatto in una classe base).

Quindi, in sostanza, dovevo solo chiamare Close()prima l'oggetto StreamReader, quindi potevo aprire correttamente la connessione OleDb. Non aveva nulla a che fare con il file Excel stesso o con la stringa OleDbConnection (che è naturalmente la prima volta che stavo guardando).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.