Open XML SDK v2.0 Performance saak wanneer die verwydering van 'n eerste ry in 20.000 rye Excel lêer

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

Vra

Jy mag teëkom 'n prestasie kwessie wanneer die verwydering van 'n eerste ry in 'n 20.000 rye Excel lêer met OpenXML SDK v2.0?

Ek gebruik die delete ry kodering voorgestel in die Open XML SDK dokument. Dit neem my 'n paar minute net om die eerste ry te verwyder met behulp van Open XML SDK, maar dit neem net 'n tweede in Excel aansoek is.

Ek het uiteindelik uitgevind dat die bottel-nek is eintlik op die borrel-up benadering in die hantering van ry skrap. Daar is baie rye opdatering na die verwyderde ry. So in my geval, is daar ongeveer 20.000 rye word opgedateer, die verskuiwing van die data ry deur ry.

Ek wonder of daar enige vinniger manier om die ry te skrap nie.

Doen iemand 'n idee?

Was dit nuttig?

Oplossing

Wel, die slegte nuus hier is:. yep, dit is die manier waarop dit is

Jy mag effens beter prestasie te beweeg buite die SDK self in System.IO.Packaging en net die skep van 'n IEnumerable / List in soos Linq-tot-XML van al die rye, kopieer dit na 'n nuwe IEnumerable / List sonder die eerste ry, herskryf die r kenmerk van <row r="?"/> om dit se plek in die indeks, en die skryf wat terug binne <sheetData/> oor bestaande kinders.

'n Mens sou nodig het om soort van doen dieselfde vir enige snare in die sharedStrings.xml lêer - dit wil sê die verwydering van die <ssi>.<si> elemente wat in die ry wat is verwyder was, maar in hierdie geval is dit nou implisiet geïndekseer, sodat jy in staat wees om weg te kom met net hulle volslae verwydering.

Ander wenke

Die benadering van die pak die lêer, manipuleer dit en herverpakking dit is baie foute snoei.

Hoe gaan dit: As jy sê, dat dit goed werk in Excel: Het jy al probeer om die Interop gebruik? Dit begin 'n nuwe geval van Excel (hetsy sigbaar of onsigbaar), dan kan jy die lêer oop te maak, die lyn te verwyder, Stoor en maak die aansoek weer.

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

Die Range-voorwerp is gekwalifiseer het vir baie doeleindes. Ook vir die verwydering van elemente. Het jy 'n blik op: MSDN Range-beskrywing . Nog 'n wenk: Interop gebruik Excel, so al die voorwerpe moet word gerig met 'n 1-gebaseerde indeks! Vir meer hulpbronne 'n blik op hierdie StackOverflow-draad .

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top