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
您可以尝试反转列表并以相反的顺序删除。
ws.Drawings
.Where(r => r.From.Row == 3 && r.To.Row == 3)
.Reverse()
.ToList()
.ForEach(r => ws.Drawings.Remove(r));
为什么会这样?
这是EPPlus中的ExcelDrawings类。
https://github.com/JanKallman/EPPlus/blob/master/EPPlus/Drawing/ExcelDrawings.cs
您可以看到图形名称-索引键-值对正在存储在字典中。
private Dictionary<string, int> _drawingNames;
并且您可以看到在ExcelDrawing的Remove方法重载中它正在调用Remove(int Index)方法。
public void Remove(ExcelDrawing Drawing)
{
Remove(_drawingNames[Drawing.Name]);
}
[每当删除工程图时,下一个工程图的索引都会改变,但是字典将保持不变,当您尝试删除索引超出范围的工程图时,字典将抛出异常。即使在此行之后有更多图纸,它也可能不会引发异常,但会删除不正确的图纸。
当您反转删除顺序时,这意味着较早删除较高的索引,那么它不会影响数组中较小的索引。