Migliorare le prestazioni di scrittura MS Excel
-
27-09-2019 - |
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?
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 !!!