2

我在从 MS-Excel 单元读取/写入数据时遇到性能问题。我正在使用 MS Excel 11.0 对象库通过 VB.NET 实现自动化。

目前读取/写入 Excel 文件需要花费太多时间。(读取 1000 行 10 分钟 :( )。似乎逐个单元格的读写方法效率不高。有没有办法使用批量操作读取/写入数据?

4

2 回答 2

6

您可以读取整个范围并将其保存到二维数组中,而不是逐个单元格地读取。然后,您可以访问 2D 数组,就像访问 excel 中的单元格一样。

我不精通 VB.NET 中的 excel 对象,但如果您了解 C#,请快速阅读此链接并尝试实现它。

http://dotnetperls.com/excel-interop 阅读“获取工作簿数据”部分

于 2010-08-09T14:41:43.603 回答
4

伟大的!!!

我使用了 2D 数组方法并实现了巨大的性能提升!!。

以前我使用了逐个单元格的方法,如下所示,

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

我曾经迭代一系列单元格并用于复制每个单元格中的值。这里的每一个sheet.Cellscell.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

在这些修改之后,我收集了方法和结果的性能数据都非常棒!后一种方法是前一种方法的 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/306023,http : //dotnetperls.com/excel-interop(感谢 ChickSentMeHighE 的链接)

欣赏表演!!!

于 2010-08-10T06:56:47.850 回答