MS Excelの書き込みの性能を向上しました。
-
27-09-2019 - |
質問
私は、パフォーマンスの問題に直面しています。私はVB.NETでの自動化のためにMSエクセル11.0オブジェクトライブラリを使用しています。
は現在、それは/からExcelファイルへの読み書きに時間がかかりすぎます。 (1000行を読むために10分:()。セルごとの読み書きのアプローチは、そのeffiecientではないようです。読むために/一括操作を使用して、書き込みデータをどのような方法は、
?あります解決
セルによってセルを読み出すことは、あなたが全体の範囲を読み、2Dにそれを救うことができるのではなくarrray。 Excelでセルにアクセスするとあなたはその後、2次元配列にアクセスすることができます。
私はうまくExcel用VB.NETに精通していないよ、オブジェクトが、あなたは、C#を理解している場合、このリンクに速い読み取りを与え、それを実装しようとします。
http://dotnetperls.com/excel-interopする 「ワークブックのデータの取得」セクションを読む
他のヒント
グレート!
Iは2Dアレイアプローチを使用し、膨大なパフォーマンスの向上を達成!!。
以下に示すように、以前私がセル・バイ・セルaprroachを用い、
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
Iは、セルの範囲を反復処理するために使用され、各セルの値をコピーするために使用されます。
ここでは、すべてのsheet.Cells
とcell.Value
は相互運用コールで、すべての呼び出しのために、それはより多くの時間がかかります。Excel.exeへの呼び出しを与えます。
私は2次元配列で、Excelのセルにコピーした後、細胞の選択reangeの値に2次元アレイを割り当てられるデータを、充填されたで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)
のパフォーマンスをお楽しみください!!!