Open XML SDK v2.0 Проблемы с производительностью при удалении первой строки в файле Excel с более чем 20000 строками

Кто-нибудь сталкивался с проблемой производительности при удалении первой строки в файле Excel с более чем 20000 строками с помощью OpenXML SDK v2.0?

Я использую кодировку удаления строки, предложенную в документе Open XML SDK. Удаление первой строки с помощью Open XML SDK занимает у меня несколько минут, а в приложении Excel - всего за секунду.

В конце концов я обнаружил, что узкое место на самом деле заключается в подходе всплывающего окна при удалении строк. После удаленной строки обновляется много строк. Итак, в моем случае необходимо обновить около 20 000 строк, сдвигая данные строка за строкой.

Интересно, есть ли более быстрый способ удалить строку.

У кого-нибудь есть идея?


person Perpetual Learner    schedule 10.12.2009    source источник


Ответы (2)


Что ж, плохие новости: да, так оно и есть.

Вы можете получить немного лучшую производительность, перейдя за пределы самого SDK в System.IO.Packaging и просто создав _2 _ / _ 3_ в виде Linq-to-XML всех строк, скопируйте это в новый _4 _ / _ 5_ без первой строки, перепишите атрибут r <row r="?"/>, чтобы оно было размещено в индексе, и записать это обратно внутри <sheetData/> над существующими дочерними элементами.

Вам нужно будет сделать то же самое для любых строк в файле sharedStrings.xml, то есть удалить элементы <ssi>.<si>, которые были в строке, которая была удалена, но в этом случае они теперь неявно индексируются , так что вы сможете просто удалить их.

person Todd Main    schedule 23.07.2010

Подход, заключающийся в разархивировании файла, манипулировании им и его переупаковке, очень исключает ошибки.

Как насчет этого: если вы скажете, что он отлично работает в Excel: вы пробовали использовать Interop? Это запускает новый экземпляр Excel (видимый или невидимый), затем вы можете открыть файл, удалить строку, сохранить и снова закрыть приложение.

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

Объект Range подходит для многих целей. Также для удаления элементов. Взгляните на: MSDN Range-Description < / а>. Еще один совет: Interop использует Excel, поэтому все объекты должны иметь индекс, отсчитываемый от 1! Дополнительные ресурсы см. В этом потоке StackOverflow.

person Alexander Pacha    schedule 27.09.2012