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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top