SDK aperto XML problema v2.0 prestazioni durante l'eliminazione di una prima fila a 20.000 righe di file Excel

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

Domanda

Fare chiunque venire attraverso un problema di prestazioni durante l'eliminazione di una prima fila in un file di Excel 20.000 righe utilizzando OpenXML SDK v2.0?

Sto usando la riga di eliminazione codifica suggerito nel documento SDK Open XML. Ci vogliono me diverse minuti solo per eliminare la prima fila utilizzando Open XML SDK, ma ci vuole solo un attimo in Excel applicaton.

Alla fine ho scoperto che il collo di bottiglia è in realtà su un approccio bolla-up nel trattare con la riga eliminazione. Ci sono molte righe di aggiornamento dopo la riga eliminata. Quindi, nel mio caso, ci sono circa 20.000 righe da aggiornare, spostando la riga di dati per riga.

Mi chiedo se c'è un modo più veloce per fare la cancellazione fila.

Fare qualcuno ha un'idea?

È stato utile?

Soluzione

Bene, la cattiva notizia è: Sì, questo è il modo in cui è

.

È possibile ottenere prestazioni leggermente migliori al di fuori del SDK si spostano in System.IO.Packaging e solo la creazione di un IEnumerable / List dentro come LINQ-to-XML di tutte le righe, copiare che ad un nuovo IEnumerable / List senza la prima fila, riscrittura l'attributo r di <row r="?"/> per essere il suo posto nell'indice, e la scrittura che torna <sheetData/> dentro sopra i bambini già esistenti.

Dovreste tipo di fare lo stesso per tutte le stringhe nel file sharedStrings.xml - ad esempio eliminando gli elementi <ssi>.<si> che erano in prima fila che è stato eliminato, ma in questo caso sono ora implicitamente indicizzati, in modo da dovreste essere in grado di farla franca solo a titolo definitivo rimuoverli.

Altri suggerimenti

L'approccio di decomprimere il file, la manipolazione e il reimballaggio è molto error-prune.

Che ne dite di questo: se tu dici, che funziona benissimo in Excel: Hai provato a utilizzare l'Interop? Questo avvia una nuova istanza di Excel (sia visibile o invisibile), allora è possibile aprire il file, cancellare la linea, salvare e chiudere nuovamente l'applicazione.

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();
}

La gamma-oggetto è qualificato per vari scopi. Anche per l'eliminazione di elementi. Date un'occhiata a: MSDN Range-Descrizione . Un altro suggerimento: Interop usa Excel, in modo che tutti gli oggetti devono essere indirizzato con un indice di 1-based! Per maggiori risorse dare un'occhiata a questo StackOverflow-thread .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top