2010-08-09 31 views
2

我在從/向MS-Excel單元讀取/寫入數據時遇到性能問題。我正在使用MS Excel 11.0對象庫進行VB.NET自動化。提高MS Excel寫作的性能

目前需要太多時間來讀取和寫入Excel文件。 (10分鐘讀取1000行:()。看起來單元格讀寫方法並不是那麼高效。是否有任何方法使用批量操作讀取/寫入數據?

回答

6

而不是讀取單元格你可以讀取一個完整的範圍並將其保存到一個2D arrray中,然後就可以訪問這個二維數組了,就像你在excel中訪問一個單元格一樣

我不太熟悉VB.NET的excel對象,但是如果你瞭解C#,然後給這個鏈接一個快速閱讀,並嘗試實現它。

http://dotnetperls.com/excel-interop 閱讀「獲得工作簿數據」部分

4

太棒了!

我使用了二維數組的方法,並取得了巨大的性能提升!

以前我使用的細胞通過細胞aprroach如下所示,

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

我用於迭代單元格區域以及用於將值中的每個單元格複製。 這裏每個sheet.Cellscell.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/306023http://dotnetperls.com/excel-interop(感謝ChickSentMeHighE中的鏈接)

享受性能!!!

+0

Vinod,感謝您花時間發佈您的詳細結果! – Joost 2013-12-02 23:14:12