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删除图片的功能

posted @ 2025-04-02 11:54  心血来潮改个名~  阅读(131)  评论(0)    收藏  举报