EPPlus InsertRow повреждает файл Excel

В настоящее время я сравниваю разные файлы друг с другом и помещаю результат в книгу Excel с несколькими листами (по одному на сравнение файлов), используя EPPlus 4.5.3.3. Рабочие листы представляют собой простые диапазоны - без таблиц. Иногда требуется переместить содержимое одного листа Excel в определенную строку другого листа Excel. Для этого я использую функцию InsertRow EPPlus. Сама функция делает свое дело и вставляет содержимое в нужную строку. Однако при открытии рабочей книги я получаю следующие ошибки: введите здесь описание изображения

введите здесь описание изображения

Содержимое этого XML-файла следующее:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">

<logFileName>error044200_02.xml</logFileName>

<summary>Errors were detected in file 'C:\Users\...\test.xlsx'</summary>


-<repairedParts>

<repairedPart>Repaired Part: /xl/worksheets/sheet5.xml part with XML error. Load error. Line 1, column 0.</repairedPart>

</repairedParts>

Когда я добавляю содержимое в последнюю строку без использования InsertRow, все работает нормально. Кроме того, если я сохраняю ExcelPackage сразу после использования InsertRow, ошибка также присутствует, поэтому она определенно имеет какое-то отношение к этой функции (также, если я использую только один рабочий лист). После использования InsertRow кажется, что все форматирование соответствующего листа Excel испорчено. Однако вставленный контент кажется правильным. Excel изначально создается из пустого шаблона excel, который не содержит ничего, кроме имен заголовков (также была такая же проблема с шаблоном без чего-либо внутри): введите здесь описание изображения

Для воспроизведения можно использовать следующий код (это всего лишь пример — в моем случае каждый лист имеет более 50 строк):

    FileInfo filePath= new FileInfo(fileName);
    excel = new ExcelPackage(filePath);
    ExcelWorkbook wb = excel.Workbook;
    foreach (ExcelWorksheet ws in wb.Worksheets)
    {
        int i = 5;
        ws.InsertRow(i, 1);
        //same effect with ws.InsertRows(i, 1, i-1)
        ws.Cells[i, 1].Value = "test";
        ws.Cells[i, 2].Value = "test";
       //excel.Save();
    }
    excel.Save();

person Steve    schedule 31.05.2021    source источник


Ответы (1)


Хотя мой ответ не основан на EPPlus, вы смотрели этот пост?

Вставка новых строк и перемещение существующих с помощью SDK OpenXML 2.0

Я предполагаю, что вы получаете ошибки, потому что недавно добавленные строки из функции ws.InsertRow не обновляют требуемые индексы строк. Об этом упоминается в посте.

Также в комментариях есть рекомендация Всем, у кого возникает ошибка при открытии файла, попробуйте эту строку перед сохранением документа'... xlsFile.WorkbookPart.DeletePart(xlsFile.WorkbookPart.CalculationChainPart);

person Hakan Usakli    schedule 31.05.2021