Abra SDK XML questão v2.0 desempenho ao excluir uma primeira linha em mais de 20.000 linhas de arquivo Excel

StackOverflow https://stackoverflow.com/questions/1878207

Pergunta

Do alguém se deparar com um problema de desempenho ao excluir um primeira linha em um arquivo de mais de 20.000 linhas Excel usando OpenXML SDK v2.0?

Eu estou usando a linha de exclusão codificação sugerida no documento Open XML SDK. Isso me leva vários minutos apenas para excluir a primeira linha usando o Open XML SDK, mas só leva apenas um segundo em applicaton Excel.

Eu finalmente descobri que o gargalo é realmente sobre a abordagem bolha-up para lidar com a exclusão linha. Existem muitas linhas de atualização após a linha excluída. Então, no meu caso, existem cerca de 20.000 linhas a serem atualizados, deslocando-se a linha de dados por linha.

Gostaria de saber se existe alguma maneira mais rápida de fazer a exclusão linha.

Do Alguém tem uma idéia?

Foi útil?

Solução

Bem, a má notícia aqui é:. Sim, isso é do jeito que está

Você pode obter um desempenho ligeiramente melhor em movimento fora do próprio SDK para System.IO.Packaging e apenas criar um IEnumerable / List em como Linq-to-XML de todas as linhas, copiar isso para um novo IEnumerable / List sem a primeira linha, reescrita o atributo r de <row r="?"/> para ser o seu lugar no índice, ea gravação que volta para dentro <sheetData/> sobre as crianças existentes.

Você precisaria tipo de fazer o mesmo para todas as strings no sharedStrings.xml arquivo - ou seja, remover os elementos <ssi>.<si> que estavam na linha que foi excluída, mas, neste caso, eles são agora indexado implicitamente, assim que você seria capaz de fugir com apenas outright removê-los.

Outras dicas

A abordagem de descompactar o arquivo, manipulando-o e reembalagem é muito erro de ameixa.

Como sobre esta: Se você dizer, que funciona bem no Excel: Você já tentou usar o Interop? Isso inicia uma nova instância do Excel (visível ou invisível), então você pode abrir o arquivo, exclua a linha, salvar e fechar o aplicativo novamente.

using System;
using System.IO;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
public void OpenAndCloseExcel() 
{
    Excel.Application excelApp = new Excel.Application();
    // Open Workbook, open Worksheet, delete line, Save
    excelApp.Quit();
}

O Range-objeto está qualificado para muitas finalidades. Também para excluir elementos. Dê uma olhada em: MSDN Faixa-Descrição . Mais uma dica: Interop usa o Excel, para que todos os objetos têm de ser dirigida com um índice baseado em 1! Para obter mais recursos dar uma olhada este StackOverflow-thread .

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