Mejorar el rendimiento de la escritura MS Excel
-
27-09-2019 - |
Pregunta
Estoy frente a los problemas de rendimiento durante la lectura / escritura de datos desde / a las células de MS-Excel. Estoy usando MS Excel 11.0 Object Library para la automatización con VB.NET.
Actualmente se tarda demasiado tiempo para leer y escribir desde / a archivos de Excel. (10 minutos a 1000 filas leídas :(). Parece que la lectura de celda a celda y enfoque de la escritura no es que effiecient. ¿Hay alguna manera de leer / escribir datos utilizando operación masiva?
Solución
En vez de leer célula por célula se podía leer toda una gama y guardarlo en un arrray 2D. A continuación, puede acceder a la matriz 2D como era de acceder a una celda en Excel.
No estoy muy versado en VB.NET para los objetos de Excel pero si usted entiende C # y luego dan a este enlace de una lectura rápida y tratar de ponerlo en práctica.
http://dotnetperls.com/excel-interop Lea la sección "Cómo obtener los datos del libro"
Otros consejos
Great !!!
utiliza el enfoque de matriz 2D y alcanzó el enorme aumento de rendimiento !!.
Anteriormente I utiliza la aprroach celda por celda como se muestra a continuación,
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
I usado para iterar sobre una gama de células y se utiliza para copiar el valor en cada celda.
Aquí cada sheet.Cells
y cell.Value
es una llamada de interoperabilidad y para cada llamada Da llamada al Excel.exe, que cuesta más tiempo.
enfoque En 2D he llenado los datos, que se va a copiar en celdas de Excel, en matriz 2D y luego asignado la matriz 2D para el valor de la reange seleccionado de células. Es como se muestra a continuación,
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
Después de estas modificaciones, que se reunieron los datos de rendimiento tanto para los enfoques y los resultados son sorprendentemente grande !!. El enfoque posterior es 25 veces más rápido que la anterior .
Del mismo modo, he utilizado el enfoque de matriz 2D para leer datos a partir de células y visto el aumento de rendimiento similar. Ejemplos de código son como se muestran a continuación.
enfoque de la célula por célula,
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 enfoque array,
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
Por favor, consulte, http://support.microsoft.com/kb/306023 , http://dotnetperls.com/excel-interop (gracias ChickSentMeHighE para el enlace)
Disfrute del rendimiento !!!