EPPlus,删除该行和该行中的图像

问题描述 投票:2回答:1
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

c# excel epplus
1个回答
1
投票

您可以尝试反转列表并以相反的顺序删除。

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]);
}

[每当删除工程图时,下一个工程图的索引都会改变,但是字典将保持不变,当您尝试删除索引超出范围的工程图时,字典将抛出异常。即使在此行之后有更多图纸,它也可能不会引发异常,但会删除不正确的图纸。

当您反转删除顺序时,这意味着较早删除较高的索引,那么它不会影响数组中较小的索引。

© www.soinside.com 2019 - 2024. All rights reserved.