Il modo migliore per ottenere il valore del testo delle celle in un file Excel (*.xls).
Domanda
Sto cercando di scrivere una funzione di importazione per estrarre i dati da un file Excel.Il modo in cui lo faccio attualmente è il seguente:
Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
xlApp = New Excel.ApplicationClass
xlWorkBook = xlApp.Workbooks.Open(FileName)
xlWorkSheet = xlWorkBook.Worksheets(1)
Dim columnrange = xlWorkSheet.Columns
Dim therange = xlWorkSheet.UsedRange
''Add rows by column
For rCnt = 2 To therange.Rows.Count
Dim rowArray(therange.Columns.Count) As String
For cCnt = 1 To therange.Columns.Count
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Dim celltext As String
celltext = Obj.Value.ToString
rowArray((cCnt - 1)) = celltext
Next
childform.datagridSample.Rows.Add(rowArray)
Next
'' make sure we close the excel.exe service after use
xlWorkBook.Close()
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
End Sub
Il problema, ovviamente, è che funziona malissimo.Da quello che ho capito, molto probabilmente si riduce a questa riga:
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Tutto ciò di cui ho bisogno è il testo delle celle, non creare un oggetto per ogni cella (e quindi non inviarli alla garbage collection).C'è un modo più semplice per ottenere semplicemente il testo?
Idealmente, se riesco a ottenere un metodo per ottenere i valori di testo della cella, mi piacerebbe aggiungere più rowArray() a un array principale e aggiornare i valori del programma in un secondo momento.
Se vedi altri suggerimenti sulle prestazioni, faccelo sapere.Sarebbe molto apprezzato.=b
MODIFICARE:Mi rendo anche conto che avrei due opzioni se dovessi creare un array principale, ad esempio mArr, per contenere tutti i dati.Sarebbe meglio dal punto di vista delle prestazioni avere mArr grande e i sottoarray piccoli, o mArr piccolo e i sottoarray contenere più informazioni?
Lo chiedo perché i file che verranno importati avranno più righe che colonne, quindi mi chiedevo se esistesse un modo "impostato" per farlo.
Soluzione
Leggere il contenuto della cella individualmente è un enorme killer delle prestazioni.Il mio consiglio è di leggere prima l'intero intervallo in un array di oggetti, quindi recuperare i dati da quell'array.Non scrivo in VB.NET, ma in C# il codice assomiglia a questo:
Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];
Questo esempio legge l'intero contenuto di un foglio in cellValues (attenzione ai valori null).Lo stesso consiglio vale per scrivere sul foglio: fallo tutto in una volta, con un array.
Se sei interessato, ho un post più lungo su questo Là
Oh e comunque, sostituisci
xlApp = New Excel.ApplicationClass
di
xlApp = New Excel.Application
Altri suggerimenti
Ecco una versione C # (ma si ottiene l'essenza) che otterrà i dati in un DataTable ...
con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);
dove "SpreadSheetLocation" e "foglio di lavoro" sono un percorso di file e nomi dei fogli di lavoro, rispettivamente. È quindi possibile convertire i file DataTable agli array, se volete.
Aggiornamento: anche voi non avete bisogno di Excel installato nella macchina per questa soluzione ...
Per semplice lettura, mi piacerebbe utilizzare la dati Excel Reader disponibili su CodePlex.
macchine che utilizzano il componente non hanno bisogno di installare Excel ed è abbastanza facile da usare. Si può leggere un foglio di lavoro in un DataSet.
SpreadshsetGear per NET vi permetterà di aprire una cartella di lavoro e accedere ai valori grezzi di cellule (i numeri , il testo, logico o errore) o ottenere il testo formattato delle cellule. Perché SpreadsheetGear viene eseguito come parte della propria applicazione, piuttosto che interoperabilità COM come con Excel, verrà eseguito molto più veloce (si vedano i commenti su questa pagina per vedere quello che alcuni dei nostri clienti hanno detto a proposito delle prestazioni).
È possibile vedere i campioni dal vivo qui e scaricare la versione di prova gratuita qui .
Disclaimer: possiedo SpreadsheetGear LLC