2009-10-05 9 views
7

sto bisogno di importare un foglio di calcolo Excel nel mio programma e hanno il seguente codice:Jet Engine - 255 carattere di troncamento

string connectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;IMEX=1;HDR=NO;""", MyExcelFile.xls); 

command.CommandText = "SELECT * FROM [Sheet1$]"; 

(nota, il codice di cui sopra non è il codice vero e proprio, ma dovrebbe farvi vedere che cosa Sto facendo)

Sto ricevendo il file importato, solo il problema è che tutte le colonne nel foglio di Excel che hanno più di 255 caratteri vengono troncate.

C'è qualche modo per aggirare questo evento?

Ho letto da qualche parte che se ci si accerta che ci sia una lunga riga di testo nella colonna all'interno delle prime 8 righe, sarà trattata come un campo memo e quindi non troncata ma non sembra funzionare.

Qualche idea?

Graeme

risposta

1

Probabilmente il problema ha una soluzione più facile, ma come ultima risorsa, provare a salvare il file di Excel come file di testo CSV, poi elaborarlo utilizzando le classi di file e la manipolazione delle stringhe regolari al posto del JET motore.

+0

finito per farlo in questo modo - ora aprire il file Excel con C#, salvarlo in formato CSV e poi analizzare questo. Grazie a tutti – Graeme

+14

Questa è la soluzione? Sul serio? Che crock; fogli di calcolo Excel senza valore, inutili. Per un formato così popolare, è impossibile leggere i dati da esso in un'applicazione. Non ci sono API ben conservate, open source e completamente funzionali per la lettura di fogli di calcolo xlsx a partire da oggi, e questi motori JET e ACE sono un tale hack (indovinando i tipi di campo guardando le prime X righe, troncando i campi a 255 caratteri, gli hack del registro necessari per modificare le opzioni, excel richiesto per l'installazione per determinate funzionalità, il file aperto in excel cambia il comportamento, ecc.). Che scherzo! – Triynko

+0

@Triynko: Sono completamente d'accordo, questo è uno scherzo, e purtroppo è uno scherzo per noi sviluppatori :(Questo genere di cose mi fa iniziare a pensare di passare da MS a qualcos'altro, dopo tutto ciò prova che MS non gli importa :( –

6

Bumped in questo alcune volte. Fortunatamente c'è una modifica del registro da correggere, descritta su MSDN qui: http://support.microsoft.com/kb/189897

In effetti, Excel esamina solo le prime otto righe di dati per determinare la lunghezza delle colonne. 255 è l'impostazione predefinita se la lunghezza è 255 caratteri o meno. L'articolo MSDN cui ho fatto riferimento in precedenza spiega come aggiungere una chiave di registro "TypeGuessRows" che indica a Excel quante righe analizzare per determinare le lunghezze delle colonne.

+2

Sì, questa è la cosa che intendevo nel mio post originale: il mio registro e il valore TypeGuessRows sono 8. Inserisco intenzionalmente un valore di 500 caratteri nella riga 2 di ciascuna colonna che potrebbe avere dati grandi ma ciò non sembra fare alcuna differenza ... – Graeme

+0

Da http://blog.lab49.com/archives/196 l'idea è che puoi usare valori compresi tra 0 e 16 per questa voce di registro. 0 significa leggere le prime 16000 righe, da 1 a 16 significa leggere le prime da 1 a 16 righe. Quindi impostando questo su 500 non funzionerà, ma impostandolo su 0 dovrebbe. – Rohith

-1

In genere è preferibile importare in una tabella esistente. Non è troppo difficile creare una tabella adatta tramite codice.

+1

E a quei problemi di 255 lunghezza e tipo indovinare andare via? Potete fornire qualche campione funzionante? –

+0

Se si importa in una tabella esistente in Access, i tipi sono già impostati in Access, quindi il testo lungo deve essere impostato con un tipo di memo, eliminando il problema 255 e altri campi (colonne) dovrebbero essere impostati con il relativo digita, eliminando le supposizioni. È anche possibile modificare il registro per eliminare le supposizioni. – Fionnuala

+0

Ha funzionato per te o stai solo indovinando ("dovrebbe" non convincermi)? Inoltre, non è possibile "modificare il Registro di sistema per eliminare le ipotesi", è sufficiente rendere più affidabile l'ipotesi, ma non eliminarla al 100%. –

0

Perché non sono riuscito a trovare la risposta esatta di cui avevo bisogno, ho intenzione di lasciarlo qui nel caso in cui aiuti qualcuno.

HKEY_LOCAL_MACHINE ► Software ► Wow6432Node ► Microsoft ► Office ► 12.0 ► Access Connectivity Engine ► Engines 

TypeGuessRows = 0 

Source

Problemi correlati