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

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

Вопрос

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

Я использую кодировку удаления строки, предложенную в документе Open XML SDK.Мне требуется несколько минут, чтобы удалить первую строку с помощью Open XML SDK, но в приложении Excel это занимает всего секунду.

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

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

Есть ли у кого-нибудь идеи?

Это было полезно?

Решение

Итак, плохие новости заключаются в следующем: да, именно так оно и есть.

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

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

Другие советы

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

Как насчет этого:Если вы скажете, что в 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.Еще одна подсказка:Interop использует Excel, поэтому все объекты должны иметь индекс, отсчитываемый от 1!Дополнительные ресурсы см. этот поток StackOverflow.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top