Domanda

Sono di fronte problemi di prestazioni durante la lettura / scrittura dei dati da / per le cellule MS-Excel. Sto usando MS Excel 11.0 Object Library per l'automazione con VB.NET.

Al momento ci vuole troppo tempo per leggere e scrivere da / verso file Excel. (10 minuti per leggere con 1000 righe :(). Sembra che la lettura cella per cellulare e di scrivere approccio non è che effiecient. C'è un modo per leggere / scrivere dati tramite un'operazione di massa?

È stato utile?

Soluzione

Invece di leggere cella per cella si poteva leggere tutta una serie e salvarla in un 2D arrray. È quindi possibile accedere alla matrice 2D come si farebbe accedere ad una cella in Excel.

Io non sono esperto in VB.NET per oggetti di Excel, ma se si capisce C # allora dare questo link una lettura veloce e cercare di attuarlo.

http://dotnetperls.com/excel-interop Leggere la sezione "Come ottenere i dati della cartella di lavoro"

Altri suggerimenti

Grande !!!

ho usato l'approccio matrice 2D e ha raggiunto l'enorme incremento delle prestazioni !!.

precedenza ho usato l'aprroach cella per cella come mostrato sotto,

Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"

Ho usato per iterare su un intervallo di celle e utilizzato per copiare il valore in ogni cella. Qui ogni sheet.Cells e cell.Value è una chiamata di interoperabilità e per ogni chiamata si dà chiamata al Excel.exe, che costa più tempo.

approccio In 2D ho riempito i dati che devono essere copiati in celle di Excel, in matrice 2D e poi assegnato l'array 2D al valore della reange selezionato di celle. E 'come mostrato qui sotto,

Dim darray(recordCount - 1, noOfCol - 1) As String
//Fill the data in darray
//startPosRange = Get the range of cell from where to start writing data
startPosRange = startPosRange.Resize(recordCount, noOfCol)
startPosRange.Value = darray

Dopo queste modifiche, ho raccolto i dati sulle prestazioni per entrambi gli approcci e risultati sono sorprendentemente grande !!. L'approccio seguito è 25 volte più veloce precedente .

Analogamente, ho usato l'approccio matrice 2D per la lettura di dati da cellule e visto l'incremento delle prestazioni simili. Esempi di codice sono riportati di seguito.

cella per cella approccio,

Dim usedRange As Excel.Range = sheet.UsedRange
For Each row As Excel.Range In usedRange.Rows()
For Each cellData As Excel.Range In row.Cells
    //Gather cellData.Value in some container.
Next

2D approccio matrice,

Dim usedRange As Excel.Range = sheet.UsedRange
//Here the array index starts from 1. why???
Dim darray(,) As Object = CType(usedRange.Value, Object(,))

Dim rows As Integer = darray.GetUpperBound(0)
Dim cols As Integer = darray.GetUpperBound(1)
For i As Integer = 1 To rows    
    For j As Integer = 1 To cols
        Dim str As String
        If darray(i, j) Is Nothing Then
            str = ""
        Else
            str = darray(i, j).ToString
        End If
        //Use value of str
    Next
Next

Si prega di fare riferimento, http://support.microsoft.com/kb/306023 , http://dotnetperls.com/excel-interop (grazie ChickSentMeHighE per il link)

Godetevi le prestazioni !!!

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