2

MS-Excelセルとの間でデータを読み書きしているときにパフォーマンスの問題に直面しています。VB.NETで自動化するためにMSExcel11.0オブジェクトライブラリを使用しています。

現在、Excelファイルの読み取りと書き込みに時間がかかりすぎています。(1000行を読み取るのに10分:()。セルごとの読み取りと書き込みのアプローチはそれほど効率的ではないようです。一括操作を使用してデータを読み取り/書き込みする方法はありますか?

4

2 に答える 2

6

セルごとに読み取るのではなく、範囲全体を読み取って2D配列に保存することができます。その後、Excelのセルにアクセスするのと同じように、2D配列にアクセスできます。

私はExcelオブジェクトのVB.NETに精通していませんが、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

2Dアレイアプローチ、

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