问题描述
我目前正在相互比较不同的文件,并使用 EPPlus 4.5.3.3 将输出放在一个 Excel 工作簿中,其中包含多个工作表(每个文件比较一个)。 工作表是简单的范围 - 没有表格。 有时需要将一个 Excel Sheet 的内容移动到另一个 Excel Sheet 中的某一行。 为此,我使用了 EPPlus 的 InsertRow 函数。该函数本身可以解决问题并将内容插入所需的行。 但是,当打开工作簿时,我收到以下错误:
<?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 创建的,它只包含标题名称(也有与模板相同的问题,里面没有任何内容):
以下代码可用于重现(这只是一个示例 - 在我的情况下,每张纸都有 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);>