繁体   English   中英

提高MS Excel写作的性能

[英]Improve performance of MS Excel writing

从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"

我过去常常迭代一系列单元格,并用于复制每个单元格中的值。 这里每个sheet.Cellscell.Value都是一个互操作调用,每次调用它都会调用Excel.exe,这需要花费更多的时间。

在2D方法中,我已经在2D单元中填充要在Excel单元格中复制的数据,然后将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

经过这些修改,我收集了两种方法的性能数据,结果非常棒! 后一种方法的速度是前一种方法的25倍

同样,我使用2D阵列方法从单元格中读取数据,并看到类似的性能提升。 代码示例如下所示。

逐个细胞的方法,

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

二维阵列方法,

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的链接)

享受表演!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM