2009-06-08 15 views
8

sto importare dati da un foglio di Excel a una DataTable utilizzando il seguente codice:DateTime formato non corrispondente sulla importazione da foglio di Excel

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0"); 
con.Open(); 
_myDataSet = new DataSet(); 
OleDbDataAdapter myCommand = new OleDbDataAdapter(" SELECT * FROM [" + "Sheet1" + "$]", con); 
myCommand.Fill(_myDataSet); 
con.Close(); 

Ho una colonna Date nel foglio Excel in formato dd/MM/yyyy. Il codice sopra riportato non funziona quando la data è dd/MM/yyyy (ad esempio 27/12/2009). Come specificare il formato della data?

EDIT (l'aggiunta di ulteriori dettagli):

Non è gettare alcuna eccezione. I dati vengono importati nello DataSet fino alla riga in cui è stato rilevato un formato Date non valido. Ho la data come dd/MM/yyyy nel foglio Excel. Quando si importa utilizzando OleDbDataAdapter, è previsto che la data nel foglio di Excel sia MM/dd/yyyy. Ovviamente, quando incontra una data come 27/2/2009, interrompe il processo di importazione, sebbene non venga emesso alcun errore/eccezione. Quindi sto avendo solo risultati parziali in DataTable.

Per favore aiuto.

+0

Se si apre il foglio in Excel, le celle vengono riconosciute come date? puoi applicare ad esempio la funzione "mese" su di loro? – tekBlues

+0

Cosa vuoi dire che il codice sta fallendo? C'è un'eccezione o i dati non vengono riconosciuti come data? –

+0

Non sta generando alcuna eccezione. I dati vengono importati nel DataSet fino alla riga in cui viene rilevato un formato Data non valido. Ho la data come gg/MM/aaaa in foglio Excel. Quando si importa con OleDbDataAdapter, è previsto che la data nel foglio Excel sia in MM/gg/aaaa.Ovviamente, quando incontra una data come "27/2/2009", interrompe il processo di importazione, anche se non vengono emessi errori/eccezioni. Aiuto di Pls! – devnull

risposta

4

Tirare in data o altre voci della colonna mista di dati in passato mi ha morso con Excel.

Sembra che il provider "visualizzi" in anticipo XX righe (a seconda della versione del provider) per determinare quale tipo di colonna è in fase di esecuzione. Le risposte precedenti che applicano proprietà alla tua connessione mi hanno aiutato in passato, ma faccio la guida non quando hai delle date BLANK e/o valori diversi nella colonna stessa - confonde il driver Excel.

Quello che mi consiglia è utilizzare FileHelpers o un'altra libreria di terze parti. Il componente di Infragistics Excel mi ha trattato molto bene, mentre FileHelpers è opensource.

0

Quante righe hai e sono tutte le celle nelle date valide della colonna della data? A volte le routine OleDB identificheranno erroneamente una colonna come testo se c'è qualche incoerenza nelle celle nelle prime 8 righe. (8 è il numero predefinito di righe che si legge per determinare i tipi di dati)

1

Si potrebbe utilizzare le informazioni Cultura britannica per analizzare la data in inglese gg Format/MM/AAAA

CultureInfo culture = new CultureInfo("en-GB"); 
DateTime date = DateTime.Parse("27/12/2009", culture); 

dove "27/12/2009 "è il tuo campo data

+1

Ciò non funziona poiché 'OleDbDataReader' converte automaticamente il testo in una data prima che sia possibile ottenere il valore non elaborato. – Enigmativity

0

forse prova a formattare la colonna della data in Excel e poi importa?

0

Si consiglia di controllare che la cultura attuale si esegue supporta stile UK dates.Here è un link su come controllare e modificare questo al livello di thread http://support.microsoft.com/kb/306162

La stringa di connessione OleDb sembra sostenere "; Locale Identifier = ". Penso che l'identificatore di eb-GB sia 2057 (non citarlo;)), potresti anche provare.

Per quanto riguarda le eccezioni che non vengono lanciate, penso che durante il riempimento si desideri esaminare gli eventi RowUpdated come da questo collegamento http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(VS.80).aspx.

Questo è il modo in cui il metodo Fill del DataSet funziona uscendo dalla riga in cui si è verificato un problema, utilizzando gli eventi sopra riportati è possibile che alcune opzioni ignorino la riga o la riformattazione.

0

Una cosa che si dovrebbe sempre specificare nella stringa di connessione è IMEX = 1:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;IMEX=1\" 

Aiuta con l'analisi di colonne che contengono entrambi i numeri e stringhe. Potrebbe aiutare con la data di analisi pure, ma poi si dovrà convertire manualmente tutte le date con:

System.IFormatProvider format = new System.Globalization.CultureInfo("en-US", true); 
DateTime d = DateTime.Parse(dataSet.Tables[0].Rows[i]["MyDate"] as string,format); 
0

Come di riempire il set di dati di programmazione invece che tramite un adattatore di dati?

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0"); 

Dim _myDataSet As New DataSet 
       Dim con As New OleDb.OleDbConnection 
       con.Open() 
       Dim cmd As New OleDb.OleDbCommand(" SELECT * FROM [" + "Sheet1" + "$]", con) 
       Using dr = cmd.ExecuteReader() 
        While dr.Read 
         Dim row = _myDataSet.Tables(0).NewRow() 
         With dr.Item("excel date column").ToString 
          Dim dt As New Date(CInt(.Substring(6)), CInt(.Substring(3, 2)), CInt(.Substring(0, 2))) 
          row.Item("dataset datecolumn") = dt 
         End With 

         \*'populate other columns here' *\ 
         _myDataSet.Tables(0).Rows.Add(row) 
        End While 


       End Using 
0

È possibile utilizzare questa funzione per formattare qualsiasi formato di data ricevuto nel formato desiderato.

Ecco il codice:

Public Shared Function ConvertToDate(ByVal dateString As String, ByRef result As DateTime) As Boolean 
Try 

'Here is the date format you desire to use 
Dim supportedFormats() As String = New String() {”dd/MM/yyyy”} 

'Now it will be converted to what the machine supports 
result = DateTime.ParseExact(dateString, supportedFormats,System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None) 

Return True 
Catch ex As Exception 
Return False 
End Try 
End Function 
2

Quando si collegano fogli di calcolo Excel in MS Access, si verifica un problema quando una colonna ha tipi di dati misti. Ad esempio, se la prima riga nella colonna è "Testo" e i rimanenti sono numerici, i campi numerici verranno formattati come Testo ed #Errore. Allo stesso modo con date e non date mescolate nella stessa colonna.

Ci sono alcune belle tentativi di risposte lì, ma qui è la soluzione semplice a leggere questi tipi di dati misti, senza un errore di tipo di dati non corrispondente:

Prova ad aggiungere "IMEX = 1" al tuo MS Access SQL, come ad esempio:

selezionare il tipo, larghezza, peso

FROM [Excel 8.0; IMEX = 1; DATABASE = C: \ TEMP \ MySpreadsheet.xls] .MyExcelTable

Grazie, Brian Jasmer

+0

Questo ha risolto il problema per me. Fondamentalmente il mio codice gestisce l'inserimento dei dati in base alle informazioni sulla cultura. Quindi tutto ciò di cui avevo bisogno era che i dati dell'excel fossero in formato stringa e non in formato DateTime. L'aggiunta di "IMEX = 1" alla stringa di connessioni ha funzionato. – Rahatur

0

Ho anche affrontato lo stesso problema. La colonna Data nel foglio Excel è gg/MM/aaaa. Ma come per le mie impostazioni di sistema, il formato dei dati è MM/gg/aaaa. Pertanto, se la data è il 31/07/2013 ad esempio, il campo Data viene visualizzato come stringa vuota.

L'utilizzo di IMEX1 insieme al driver "Microsoft.ACE.OLEDB.12.0" ha risolto il problema.

"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + FilePath + "; estesa Properties = 'Excel 12.0; HDR = Yes; IMEX = 1;'"

Ma "Provider = Microsoft .Jet.OLEDB.4.0;" + "Origine dati =" + FilePath + "; Proprietà estese = Excel 8.0; IMEX = 1" non funziona.

Problemi correlati