我在從/向MS-Excel單元讀取/寫入數據時遇到性能問題。我正在使用MS Excel 11.0對象庫進行VB.NET自動化。提高MS Excel寫作的性能
目前需要太多時間來讀取和寫入Excel文件。 (10分鐘讀取1000行:()。看起來單元格讀寫方法並不是那麼高效。是否有任何方法使用批量操作讀取/寫入數據?
我在從/向MS-Excel單元讀取/寫入數據時遇到性能問題。我正在使用MS Excel 11.0對象庫進行VB.NET自動化。提高MS Excel寫作的性能
目前需要太多時間來讀取和寫入Excel文件。 (10分鐘讀取1000行:()。看起來單元格讀寫方法並不是那麼高效。是否有任何方法使用批量操作讀取/寫入數據?
而不是讀取單元格你可以讀取一個完整的範圍並將其保存到一個2D arrray中,然後就可以訪問這個二維數組了,就像你在excel中訪問一個單元格一樣
我不太熟悉VB.NET的excel對象,但是如果你瞭解C#,然後給這個鏈接一個快速閱讀,並嘗試實現它。
http://dotnetperls.com/excel-interop 閱讀「獲得工作簿數據」部分
太棒了!
我使用了二維數組的方法,並取得了巨大的性能提升!
以前我使用的細胞通過細胞aprroach如下所示,
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
我用於迭代單元格區域以及用於將值中的每個單元格複製。 這裏每個sheet.Cells
和cell.Value
是一個interop調用,並且每調用一次,它都會調用Excel.exe,這會花費更多的時間。
在二維方法中,我在二維數組中填充要在Excel單元格中複製的數據,然後將二維數組分配給所選單元格的值。它如下所示,
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
經過這些修改後,我收集了這兩種方法的性能數據,結果出奇的好!! 後面的方法比前面的方法快了25倍。
同樣,我使用二維數組方法從單元中讀取數據,並看到類似的性能提升。代碼示例如下所示。
細胞通過細胞的方法,
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陣列的方法,
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
請參考, http://support.microsoft.com/kb/306023, http://dotnetperls.com/excel-interop(感謝ChickSentMeHighE中的鏈接)
享受性能!!!
Vinod,感謝您花時間發佈您的詳細結果! – Joost 2013-12-02 23:14:12