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?

War es hilfreich?

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 !!!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top