Open XML SDK v2.0. Проблема с производительностью при удалении первой строки в файле Excel, насчитывающем более 20 000 строк.
-
18-09-2019 - |
Вопрос
Кто-нибудь сталкивался с проблемой производительности при удалении первой строки в файле 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.