MS-Excelセルとの間でデータを読み書きしているときにパフォーマンスの問題に直面しています。VB.NETで自動化するためにMSExcel11.0オブジェクトライブラリを使用しています。
現在、Excelファイルの読み取りと書き込みに時間がかかりすぎています。(1000行を読み取るのに10分:()。セルごとの読み取りと書き込みのアプローチはそれほど効率的ではないようです。一括操作を使用してデータを読み取り/書き込みする方法はありますか?
MS-Excelセルとの間でデータを読み書きしているときにパフォーマンスの問題に直面しています。VB.NETで自動化するためにMSExcel11.0オブジェクトライブラリを使用しています。
現在、Excelファイルの読み取りと書き込みに時間がかかりすぎています。(1000行を読み取るのに10分:()。セルごとの読み取りと書き込みのアプローチはそれほど効率的ではないようです。一括操作を使用してデータを読み取り/書き込みする方法はありますか?
セルごとに読み取るのではなく、範囲全体を読み取って2D配列に保存することができます。その後、Excelのセルにアクセスするのと同じように、2D配列にアクセスできます。
私はExcelオブジェクトのVB.NETに精通していませんが、C#を理解している場合は、このリンクをざっと読んで実装してみてください。
http://dotnetperls.com/excel-interop 「ワークブックデータの取得」セクションをお読みください
素晴らしい!!!
2Dアレイアプローチを使用して、パフォーマンスを大幅に向上させました!!。
以前は、以下に示すようにセルごとのアプローチを使用していましたが、
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
以前は、セルの範囲を反復処理し、各セルの値をコピーしていました。ここでは、すべてsheet.Cells
とcell.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に感謝します)
パフォーマンスをお楽しみください!!!