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.

È stato utile?

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
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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top