EPPlus,删除行和该行的图像
EPPlus, delete row and image in this row
using (var pck = new ExcelPackage(new FileInfo(wb_path)))
{
ExcelWorksheet ws = pck.Workbook.Worksheets[ws_name];
ws.DeleteRow(3,1,true);
pck.Save();
}
这不会删除位于该行中的图像。该图像是一个小图标,适合一个单元格。如果在 Excel 中手动删除行,则它会随行一起消失。
我考虑过先手动删除该行的所有图像,然后再删除该行本身,但是...
ws.Drawings.Where(r => r.From.Row == 3 && r.To.Row == 3).ToList().ForEach(r => ws.Drawings.Remove(r));
...这继续删除一张图像,然后落入 System.ArgumentOutOfRangeException
我认为这是 EpPlus 的问题。如果能删除一个,不能删除另一个,可能是索引有问题。
您可以尝试颠倒列表并以相反的顺序删除。
ws.Drawings
.Where(r => r.From.Row == 3 && r.To.Row == 3)
.Reverse()
.ToList()
.ForEach(r => ws.Drawings.Remove(r));
如果您想进一步调查,可以从 GitHub 查看源代码。
这是 EPPlus 中的 ExcelDrawings class。
https://github.com/JanKallman/EPPlus/blob/master/EPPlus/Drawing/ExcelDrawings.cs
事实证明是 EPPlus 错误。我最终得到了一个 VBA 宏,它根据提供的索引删除行。似乎 Application.ScreenUpdating 必须设置为 True 才能正确删除图像。
using (var pck = new ExcelPackage(new FileInfo(wb_path)))
{
ExcelWorksheet ws = pck.Workbook.Worksheets[ws_name];
ws.DeleteRow(3,1,true);
pck.Save();
}
这不会删除位于该行中的图像。该图像是一个小图标,适合一个单元格。如果在 Excel 中手动删除行,则它会随行一起消失。
我考虑过先手动删除该行的所有图像,然后再删除该行本身,但是...
ws.Drawings.Where(r => r.From.Row == 3 && r.To.Row == 3).ToList().ForEach(r => ws.Drawings.Remove(r));
...这继续删除一张图像,然后落入 System.ArgumentOutOfRangeException
我认为这是 EpPlus 的问题。如果能删除一个,不能删除另一个,可能是索引有问题。
您可以尝试颠倒列表并以相反的顺序删除。
ws.Drawings
.Where(r => r.From.Row == 3 && r.To.Row == 3)
.Reverse()
.ToList()
.ForEach(r => ws.Drawings.Remove(r));
如果您想进一步调查,可以从 GitHub 查看源代码。
这是 EPPlus 中的 ExcelDrawings class。
https://github.com/JanKallman/EPPlus/blob/master/EPPlus/Drawing/ExcelDrawings.cs
事实证明是 EPPlus 错误。我最终得到了一个 VBA 宏,它根据提供的索引删除行。似乎 Application.ScreenUpdating 必须设置为 True 才能正确删除图像。