Npoi XSSF格式 删除图片
Npoi如何在XSSF格式下的Excel文件删除图片
- 框架版本: .net Framework 4.8.1
- Npoi版本: 2.7.2
因项目要求把原本插入的图片进行覆盖, 因此需要考虑如何去删除图片.
原本生成的操作使用Npoi进行处理的,想着应该删除也就是调个方法,没想到竟然没有.
先贴出根据行和列获取图片的方式
private Dictionary<(int, int), byte[]> GetPictureDict( XSSFSheet sheet)
{
Dictionary<(int, int), byte[]> dict = new();
XSSFDrawing drawing = sheet.GetDrawingPatriarch();
if (drawing is null)
throw new Exception("无法获取到插入的图片集");
foreach (var shape in drawing.GetShapes())
{
if (shape is XSSFPicture picture)
{
var anchor = picture.ClientAnchor as XSSFClientAnchor;
if (anchor is null) continue;
dict.Add((anchor.Row1, anchor.Col1), picture.PictureData.Data);
}
}
return dict;
}
这里把行和列处理成元组作为key,并把图片数据对象放置到字典的value中
说明Npoi是具备重新拿取图片信息的能力,所引用的对象就是XSSFDrawing 类型的 drawing
如果我想删除其中的某个图片,该怎么做呢
下意识我也会选择 在drawing 对象中去找取方法,删除某个图片
结果发现只有 drawing.RemoveChart(XSSFChart chart) 这个方法
反编译来分析下RemoveChart(点击跳转github源码)

此处可以看到移除的方法其实是 cTDrawing.CellAnchors.RemoveAt(num);当然这个地方是根据索引移除的
回到 XSSFDrawing drawing这个对象中,我们调用drawing.GetCTDrawing() 这个方法 获得CT_Drawing类型的对象
回到 XSSFPicture picture这个对象中, 我们可以调用picture.cellanchor这个属性 获得IEG_Anchor类型的对象
根据列索引删除图片
private void RemoveColPicture(XSSFSheet sheet , params int[] cols)
{
var drawing = sheet.GetDrawingPatriarch() ?? throw new Exception("无法获取到插入的图片集");
var ctDraing = drawing.GetCTDrawing();
foreach (var shape in drawing.GetShapes())
{
if (shape is XSSFPicture picture)
{
var anchor = picture.ClientAnchor;
foreach (var col in cols)
{
if (anchor.Col1 == col)
ctDraing.CellAnchors.Remove(picture.cellanchor);
}
}
}
}
到此我们就完成了在Npoi删除图片的功能

浙公网安备 33010602011771号