0

我继承了一个使用 Office.Interop.Excel 将数据插入电子表格的大型项目。

就可见交互而言,您单击一个按钮会出现一个 Excel 电子表格,其中所有数据都已插入。我之所以提到这一点,是因为我已经在其他地方看到它已经打开程序并插入了值。我正在使用的程序在 Excel 出现之前插入数据。

不幸的是,一旦插入了相对大量的数据,到 Excel 的信息传输就会被锁定,程序无法继续。

无论如何,我做了一些调查,发现以下行:

myWorksheet.Range("A" & rowNumber).Resize(dataArray.GetUpperBound(0) + 1, columnCount).Value = dataArray

这会将 dataArray 中的所有数据直接复制到工作表中的一堆单元格中。

我猜测问题可能是由于尝试一次传输如此大量的数据引起的,所以我将其更改为逐行复制数据:

For horizIndex As Integer = 0 To dataArray.GetUpperBound(0)
    Dim subArr(0, arr.GetUpperBound(1)) As Object
    For columnIndex As Integer = 0 To dataArray.GetUpperBound(1)
        subArr(0, columnIndex) = dataArray(horizIndex, columnIndex)
    Next
    myWorksheet.Range("A" & (rowNumber + horizIndex)).Resize(horizIndex + 1, columnCount).Value = arr
Next

这会将 350 左右的行复制到 Excel,然后行设置值停止返回。

任何人都可以提出解决这个问题的方法吗?

编辑:好的,我已经尝试了 Lazarus 在下面提出的一些建议,这就是我现在所处的位置:

只要数据相对较短,或者数据类型相当简单(整数等),代码的所有变体都可以正常工作。原始的大量复制工作正常,逐行复制和逐单元复制工作,只要数据集小或简单。

但是,我的实际数据集相对复杂,并且包含多种数据类型,包括字符串。

它在 350 行之后倒下。它落在代码的 Excel 端,线程转到 Excel 并且永远不会回来。

那么,还有什么想法,有人吗?

4

1 回答 1

1

我认为这里的问题在于您不断扩大的细胞范围。

我会修改这条线:

myWorksheet.Range("A" & (rowNumber + horizIndex)).Resize(horizIndex + 1, columnCount).Value = arr

读书

myWorksheet.Range("A" & (rowNumber + horizIndex)).Resize(1, columnCount).Value = subArr

编辑

鉴于您正在有效地迭代每个单元格,为什么不利用它:

For horizIndex As Integer = 0 To dataArray.GetUpperBound(0)
    For columnIndex As Integer = 0 To dataArray.GetUpperBound(1)
        myWorksheet.Cells(horizIndex + 1, columnIndex + 1).Value = dataArray(horizIndex, columnIndex)
    Next
Next
于 2011-02-04T12:12:47.900 回答