Melhorar o desempenho da redação do MS Excel
-
27-09-2019 - |
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?
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 !!!