EPPlus InsertRow 损坏 excel 文件

问题描述

我目前正在相互比较不同的文件,并使用 EPPlus 4.5.3.3 将输出放在一个 Excel 工作簿中,其中包含多个工作表(每个文件比较一个)。 工作表是简单的范围 - 没有表格。 有时需要将一个 Excel Sheet 的内容移动到另一个 Excel Sheet 中的某一行。 为此,我使用了 EPPlus 的 InsertRow 函数。该函数本身可以解决问题并将内容插入所需的行。 但是,当打开工作簿时,我收到以下错误

enter image description here

enter image description here

该 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 的情况下在最后一行添加内容时,一切正常。 此外,如果我在使用 InsertRow 后立即保存 ExcelPackage,也会出现错误,所以它肯定与这个函数有关(如果我只使用一个工作表)。使用 InsertRow 后,似乎各个 Excel 工作表的整个格式都搞砸了。插入的内容似乎是正确的。 excel 最初是从一个空模板 excel 创建的,它只包含标题名称(也有与模板相同的问题,里面没有任何内容):

enter image description here

以下代码可用于重现(这只是一个示例 - 在我的情况下,每张纸都有 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();

解决方法

虽然我的回答不是基于 EPPlus,但你看过这篇文章吗?

Inserting new rows and moving exsisting ones with OpenXML SDK 2.0

我猜您收到错误是因为 ws.InsertRow 函数中新添加的行没有更新所需的行索引。这在帖子中提到了。

评论中还有一条建议“对于在打开文件时遇到错误的任何人,请在保存文档之前尝试这一行”... xlsFile.WorkbookPart.DeletePart(xlsFile.WorkbookPart.CalculationChainPart);>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...