Verbessern Sie die Leistung von MS Excel Schreiben
-
27-09-2019 - |
Frage
Ich bin vor Performance-Problemen beim Lesen / Daten von / zu MS-Excel-Zellen zu schreiben. Ich bin mit MS Excel 11.0-Objektbibliothek für die Automatisierung mit VB.NET.
Zur Zeit dauert es zu viel Zeit zum Lesen und Schreiben von / nach Excel-Dateien. (10 Minuten zu lesen 1000 Zeilen :(). Es scheint, die Zelle-für-Zelle Lesen und Schreiben Ansatz ist nicht, dass effiecient. Gibt es eine Möglichkeit zum Lesen / Schreiben von Daten Massenbetrieb mit?
Lösung
Anstatt durch Zell Zelle Lesen Sie eine ganze Reihe lesen konnte und es in ein 2D speichern arrray. Anschließend können Sie den 2D-Array zugreifen, wie Sie eine Zelle in Excel zugreifen würden.
Ich bin nicht sehr versiert in VB.NET für Excel-Objekte, aber wenn Sie C # verstehen dann geben diesem Link eine schnelle lesen und versuchen, es zu implementieren.
http://dotnetperls.com/excel-interop Lesen Sie die „Erste Arbeitsmappe Daten“
Andere Tipps
Great !!!
ich verwenden, um den 2D-Array-Ansatz und erreichte die enorme Leistungssteigerung !!.
Bisher verwendete ich die Zelle-für-Zelle aprroach wie unten gezeigt,
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
Früher habe ich Iterierte über einen Bereich von Zellen und verwendet, um den Wert in jeder Zelle zu kopieren.
Hier ist jeder sheet.Cells
und cell.Value
ist ein Interop-Aufruf und für jeden Anruf gibt es Anruf an die Excel.exe, was mehr Zeit kostet.
Im 2D-Ansatz, den ich die Daten gefüllt haben, die in Excel-Zellen kopiert werden soll, in 2D-Array und dann das 2D-Array auf den Wert des ausgewählten reange von Zellen zugeordnet. Es ist, wie unten gezeigt,
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
Nach diesen Modifikationen, sammelte ich die Leistungsdaten sowohl für die Ansätze und Ergebnisse sind überraschend groß !!. Der spätere Ansatz ist 25-mal so schnell wie vorherige .
In ähnlicher Weise habe ich den 2D-Array-Ansatz verwendet, um Daten von Zellen und zu sehen, die ähnliche Leistungssteigerung zu lesen. Codebeispiele werden wie unten dargestellt.
Zelle-für-Zelle Ansatz,
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-Array-Ansatz,
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
Bitte beachten Sie, http://support.microsoft.com/kb/306023 , http://dotnetperls.com/excel-interop (dank ChickSentMeHighE für den Link)
Genießen Sie die Leistung !!!