使用NPOI从Excel中提取图片及图片位置信息

原文:使用NPOI从Excel中提取图片及图片位置信息

问题背景:

话说,在ExcelReport的开发过程中,有一个比较棘手的问题:怎么复制图片呢?

当然,解决这个问题的第一步是:能使用NPOI提取到图片及图片的位置信息。到这里,一切想法都很顺利。但NPOI到底怎么提取图片及图片的位置信息呢?NPOI能不能提取到图片的位置信息呢?

这是两个问题。是两个让BaiGoogleDu几近沉默的问题。但官方教程的评论中还是流露出了答案的蛛丝马迹。

哇咔咔,这是我去看源码寻答案的的动力。

此处省去(N多字)… …,这里宕掉了我三个晚上的时间。

不再累述,代码你懂的… ….

PicturesInfo.cs

public class PicturesInfo
{

    public int MinRow { get;set; }

    public int MaxRow { get;set; }

    public int MinCol { get;set; }

    public int MaxCol { get;set; }

    public Byte[] PictureData { get; private set; }

 

    public PicturesInfo(int minRow, int maxRow, int minCol, int maxCol,Byte[] pictureData)

    {

        this.MinRow = minRow;

        this.MaxRow = maxRow;

        this.MinCol = minCol;

        this.MaxCol = maxCol;

        this.PictureData = pictureData;

    }

}

NpoiExtend.cs

public static class NpoiExtend
{

    public static List<PicturesInfo> GetAllPictureInfos(this ISheet sheet)

    {

        return sheet.GetAllPictureInfos(null,null,null,null);

    }

 

    public static List<PicturesInfo> GetAllPictureInfos(this ISheet sheet,int? minRow,int? maxRow,int? minCol,int? maxCol,bool onlyInternal = true)

    {

        if (sheet is HSSFSheet)

        {

            return GetAllPictureInfos((HSSFSheet)sheet,minRow,maxRow,minCol,maxCol,onlyInternal);

        }

        else if (sheet is XSSFSheet)

        {

            return GetAllPictureInfos((XSSFSheet)sheet, minRow, maxRow, minCol, maxCol, onlyInternal);

        }

        else

        {

            throw new Exception("未处理类型,没有为该类型添加:GetAllPicturesInfos()扩展方法!");

        }

    }

 

    private static List<PicturesInfo> GetAllPictureInfos(HSSFSheet sheet,int? minRow, int? maxRow, int? minCol, int? maxCol, bool onlyInternal)

    {

        List<PicturesInfo> picturesInfoList = new List<PicturesInfo>();

 

        var shapeContainer = sheet.DrawingPatriarch as HSSFShapeContainer;

        if (null != shapeContainer)

        {

            var shapeList = shapeContainer.Children;

            foreach (var shape in shapeList)

            {

                if (shape is HSSFPicture && shape.Anchor is HSSFClientAnchor)

                {

                    var picture = (HSSFPicture)shape;

                    var anchor = (HSSFClientAnchor)shape.Anchor;

                    

                    if (IsInternalOrIntersect(minRow, maxRow, minCol, maxCol, anchor.Row1, anchor.Row2, anchor.Col1, anchor.Col2, onlyInternal))

                    {

                        picturesInfoList.Add(new PicturesInfo(anchor.Row1, anchor.Row2, anchor.Col1, anchor.Col2, picture.PictureData.Data));

                    }

                }

            }

        }

 

        return picturesInfoList;

    }

 

    private static List<PicturesInfo> GetAllPictureInfos(XSSFSheet sheet, int? minRow, int? maxRow, int? minCol, int? maxCol, bool onlyInternal)

    {

        List<PicturesInfo> picturesInfoList = new List<PicturesInfo>();

 

        var documentPartList = sheet.GetRelations();

        foreach (var documentPart in documentPartList)

        {

            if (documentPart is XSSFDrawing)

            {

                var drawing = (XSSFDrawing)documentPart;

                var shapeList = drawing.GetShapes();

                foreach (var shape in shapeList)

                {

                    if (shape is XSSFPicture)

                    {

                        var picture = (XSSFPicture)shape;

                        var anchor = picture.GetPreferredSize();

                        

                        if (IsInternalOrIntersect(minRow, maxRow, minCol, maxCol, anchor.Row1, anchor.Row2, anchor.Col1, anchor.Col2, onlyInternal))

                        {

                            picturesInfoList.Add(new PicturesInfo(anchor.Row1, anchor.Row2, anchor.Col1, anchor.Col2, picture.PictureData.Data));

                        }

                    }

                }

            }

        }

 

        return picturesInfoList;

    }

 

    private static bool IsInternalOrIntersect(int? rangeMinRow, int? rangeMaxRow, int? rangeMinCol, int? rangeMaxCol,

        int pictureMinRow, int pictureMaxRow, int pictureMinCol, int pictureMaxCol, bool onlyInternal)

    {

        int _rangeMinRow = rangeMinRow ?? pictureMinRow;

        int _rangeMaxRow = rangeMaxRow ?? pictureMaxRow;

        int _rangeMinCol = rangeMinCol ?? pictureMinCol;

        int _rangeMaxCol = rangeMaxCol ?? pictureMaxCol;

 

        if (onlyInternal)

        {

            return (_rangeMinRow <= pictureMinRow && _rangeMaxRow >= pictureMaxRow &&

                    _rangeMinCol <= pictureMinCol && _rangeMaxCol >= pictureMaxCol);

        }

        else

        {

            return ((Math.Abs(_rangeMaxRow - _rangeMinRow) + Math.Abs(pictureMaxRow - pictureMinRow) >= Math.Abs(_rangeMaxRow + _rangeMinRow - pictureMaxRow - pictureMinRow)) &&

            (Math.Abs(_rangeMaxCol - _rangeMinCol) + Math.Abs(pictureMaxCol - pictureMinCol) >= Math.Abs(_rangeMaxCol + _rangeMinCol - pictureMaxCol - pictureMinCol)));

        }

    }

}

时间: 2024-12-25 10:45:17

使用NPOI从Excel中提取图片及图片位置信息的相关文章

调用存储过程取到数据通过NPOI存到Excel中

//调用 public ActionResult GenerateExcel() { DataTable headerTable = new DataTable(); headerTable.Columns.Add("Status_Id", Type.GetType("System.String")); headerTable.Columns.Add("Status_Name", Type.GetType("System.String&

NPOI将Excel中的数据导入到数据库

using(FileStream fs=File.OpenRead(@"d:/MY.xls")) { IWorkbook wk = new HSSFWorkbook(fs); if (wk.NumberOfSheets>0) { ISheet sheet = wk.GetSheetAt(0); for (int i = 0; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); // //Id, Name, Pa

c# 应用NPOI 获取Excel中的图片,保存至本地的算法

1.新建一个Windows窗体应用程序 2.桌面新建一个excel,贴入两张图片 如下图: 3.在Form中拖入一个button 4.点击button,在点击事件方法中写入,要读取图片的方法:ExcelToImage 点击事件方法如下: private string exclePath = @"C:\users\lenovo\Desktop\testPic.xls"; private void button2_Click(object sender, EventArgs e) { Li

npoi导出excel(模板)插入图片,文本只读,不可以修改

NPOI下载地址:http://npoi.codeplex.com/ VPurchaseOrder purchaseOrder = PurchaseDataAccess.GetPurchaseOrder(PurchaseOrderId); HSSFWorkbook hssfworkbookDown; string modelExlPath = Server.MapPath(@"\b2c\download\供应商采购单模板.xls"); FileStream file = new Fil

Excel中提取最大值的问题

在使用excel的时候,碰到了一个如下的问题 意思是以每个字母为条件,取这个字母下面的数字中的最大值,需要注意一个问题是每个字母下面的数字个数不一定相等,例如d下面有四个数字,可以设置如下公式解决: =MAX(INDIRECT("A" & (MATCH(C1,A:A,0)+1) & ":A" & IFERROR(MATCH(C2,A:A,0)-1,65536))) 但是该公式有个缺点就是两边的字母顺序要一致,否则公式将失效.

从excel中导出高清图片

微软的excel导出的图片往往达不到投稿期刊的要求,诸如复制到word.ppt或者另存为网页等方法得到的图片也不尽人意. 据说复制到Adobe illustrator (AI)软件里可以保存为各种分辨率的位图或者矢量图. 这里推荐一个excel插件XL Toolbox,链接如下:https://www.xltoolbox.net/,可以生成各种规格(dpi)的图片. 原文地址:https://www.cnblogs.com/liulele/p/8364840.html

EXCEL中提取某行最后一个有效单元格数据

用户的需求总是多种多样的,有的如同下图:大家可以看下图,只是举例,不一定合理.每个人所属的部门的级别不同,有的人属于公司之下,有的属于team之下,而大家可以看到这个表里面有很多空白单元格,看上去不是很一目了然,现在用公式直接把所属级别直接显示在姓名后面. . 其实上面的这么多废话的中心思想就是:显示某一行最后一个有效单元格的内容 下图是适用于 文本格式的数据 下图是适用于数字格式的内容

com组件提取excel中的图片office07可以提取office13无法提取的问题

今天项目要求在公司小机房里面跑了.小机房里装的office2013 顿时我从excel中提取图片的代码就用不了了 找了一上午资料终于在stackoverflow上找到办法 贴代码: public void ReadPic(string path,List<int> noDataList) { try { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } int count = 1; int num = 0; fo

2.4.5 用NPOI操作EXCEL--插入图片

我们知道,在Excel中是可以插入图片的.操作菜单是“插入->图片”,然后选择要插入图片,可以很容易地在Excel插入图片.同样,在NPOI中,利用代码也可以实现同样的效果.在NPOI中插入图片的方法与画图的方法有点类似: //add picture data to this workbook.byte[] bytes = System.IO.File.ReadAllBytes(@"D:\MyProject\NPOIDemo\ShapeImage\image1.jpg");int