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 にコピーされ、行の設定値が単に返されなくなります。

誰でもこれを回避する方法を提案できますか?

編集:さて、私はラザロが以下に提案したことをたくさん試しました。そして、これが私が今いるところです:

データが比較的短いか、データ型がかなり単純 (整数など) である限り、コードのすべてのバリエーションが正常に機能します。データセットが小さいか単純である限り、元の大量コピーは正常に機能し、行ごとのコピーは機能し、セルごとのコピーも機能します。

ただし、実際のデータセットは比較的複雑で、文字列を含むいくつかのデータ型が含まれています。

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 に答える