Vin*_*til 2 .net excel performance automation read-write
从MS-Excel单元读取/写入数据时,我面临性能问题.我使用MS Excel 11.0对象库进行VB.NET自动化.
目前,从Excel文件读取和写入文件需要花费太多时间.(10分钟读取1000行:().似乎逐个单元的读写方法效率不高.有没有办法使用批量操作读/写数据?
您可以读取整个范围并将其保存到2D arrray中,而不是逐个单元格地读取.然后,您可以像访问Excel中的单元格一样访问2D阵列.
我不熟悉VB.NET中的excel对象,但是如果你理解了C#,那么请快速阅读这个链接并尝试实现它.
http://dotnetperls.com/excel-interop 阅读"获取工作簿数据"部分
伟大的!!!
我使用了 2D 数组方法并实现了巨大的性能提升!
以前我使用了逐个单元的方法,如下所示,
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
Run Code Online (Sandbox Code Playgroud)
我曾经迭代一系列单元格并复制每个单元格中的值。这里的每个sheet.Cellsandcell.Value都是一个互操作调用,并且对于每个调用,它都会调用 Excel.exe,这会花费更多时间。
在 2D 方法中,我已将要复制到 Excel 单元格中的数据填充到 2D 数组中,然后将 2D 数组分配给所选单元格范围的值。如下图所示,
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
Run Code Online (Sandbox Code Playgroud)
经过这些修改后,我收集了这两种方法的性能数据,结果非常好!后一种方法的速度是前一种方法的 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
Run Code Online (Sandbox Code Playgroud)
二维阵列方法,
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
Run Code Online (Sandbox Code Playgroud)
请参阅 http://support.microsoft.com/kb/306023、 http://dotnetperls.com/excel-interop(感谢 ChickSentMeHighE 提供的链接)
欣赏表演吧!!!