Pergunta

Estou enfrentando problemas de desempenho ao ler/escrever dados de/para MS-Excel Cells. Estou usando o MS Excel 11.0 Biblioteca de objetos para automação com vb.net.

Atualmente, leva muito tempo para ler e escrever de arquivos do Excel. (10 minutos para ler 1000 linhas :(). Parece que a abordagem de leitura e escrita célula por células não é tão eficaz. Existe alguma maneira de ler/gravar dados usando operação em massa?

Foi útil?

Solução

Em vez de ler células por célula, você pode ler um alcance inteiro e salvá -lo em um Arrray 2D. Você pode acessar a matriz 2D como acessaria uma célula no Excel.

Não sou bem versado no vb.net para objetos do Excel, mas se você entender C#, dê a este link uma leitura rápida e tente implementá -lo.

http://dotnetperls.com/excel-interop Leia a seção "Obter dados da pasta de trabalho"

Outras dicas

Excelente!!!

Eu usei a abordagem da matriz 2D e consegui o enorme impulso de desempenho !!.

Anteriormente, usei a célula por célula, como mostrado abaixo,

Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"

Eu costumava iterar em uma variedade de células e costumava copiar o valor em cada célula. Aqui todo sheet.Cells e cell.Value é uma chamada de interopa e, para cada chamada, liga para o Excel.exe, que custa mais tempo.

Na abordagem 2D, preenchi os dados, que devem ser copiados nas células do Excel, na matriz 2D e, em seguida, atribuímos a matriz 2D ao valor da reaange selecionada das células. É como mostrado abaixo,

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

Após essas modificações, reuni os dados de desempenho para as abordagens e os resultados são surpreendentemente ótimos !!. A abordagem posterior é 25 vezes mais rápida que a anterior.

Da mesma forma, usei a abordagem de matriz 2D para ler dados das células e vi o aumento semelhante de desempenho. As amostras de código são as mostradas abaixo.

Abordagem 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

Abordagem de matriz 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

Por favor, consulte,http://support.microsoft.com/kb/306023 , http://dotnetperls.com/excel-interop (Obrigado ChicksentMehighe pelo link)

Aproveite a performance !!!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top