1. 程式人生 > >使用NPOI從Excel中提取圖片及圖片位置資訊

使用NPOI從Excel中提取圖片及圖片位置資訊

問題背景:

話說,在ExcelReport的開發過程中,有一個比較棘手的問題:怎麼複製圖片呢?

當然,解決這個問題的第一步是:能使用NPOI提取到圖片及圖片的位置資訊。到這裡,一切想法都很順利。但NPOI到底怎麼提取圖片及圖片的位置資訊呢?NPOI能不能提取到圖片的位置資訊呢?

這是兩個問題。是兩個讓BaiGoogleDu幾近沉默的問題。但官方教程的評論中還是流露出了答案的蛛絲馬跡。

wx%0[j7z[`p]%r(6uf~es(4

哇咔咔,這是我去看原始碼尋答案的的動力。

此處省去(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)));
        }
    }
}

相關推薦

使用NPOIExcel提取圖片圖片位置資訊

問題背景: 話說,在ExcelReport的開發過程中,有一個比較棘手的問題:怎麼複製圖片呢? 當然,解決這個問題的第一步是:能使用NPOI提取到圖片及圖片的位置資訊。到這裡,一切想法都很順利。但NPOI到底怎麼提取圖片及圖片的位置資訊呢?NPOI能不能提取到圖片的位置資訊呢? 這是兩個問題。是兩個讓BaiG

NPOI匯出Excel修改格式,傳輸圖片

一、使用NPOI設定背景色 方法一:使用NOPI自帶的顏色使用方法,缺點就是自帶的樣色種類少,不夠用 HSSFWorkbook hssfworkbook = new HSSFWorkbook();//建立工作薄 styleCommonTextRedColor = hss

文字提取圖片路徑(java 解析富文字處理 img 標籤)

很多專案都需要到富文字來新增內容,就好比新聞啊,旅遊景點之類的,都需要使用富文字去新增資料,然而怎麼我這邊就發現了兩個問題 怎樣將富文字的圖片的 src 獲取出來? 方法一: 利用正則表示式: public static List<String> getImgStr(String h

多媒體開發(10):視訊提取圖片

小白:提取視訊中的圖片嗎?那很簡單,播放視訊再截圖就行啦。 播放視訊再截圖的做法,當然也可以。但是,手動地截圖會太累而且無法保證準確度,特別是需要反覆提取圖片時,或者需要提取“105秒那一瞬間的美女圖片”時,或者我需要每秒出一張圖片時,那有別的辦法嗎? 本文介紹,如何使用FFmpeg實現從視訊中提取圖片的

Excel怎樣字串提取位置和長度不固定的數字

最近上課的時候,常常有學員諮詢怎樣從Excel字元中提取位置和長度都不固定的數字,今天我們分兩種情況來聊一聊對應的解決方案。 情況1:數字前後有特定的分隔符 如果數字前後有特定的分隔符,比如()、##等分隔符,那麼我們可以通過查詢這些分隔符的位置,來定位到數字的位置。 比如下圖所示的這個

一行命令 APK 檔案提取 Endpoint URL

做IoT的人免不了要接觸Android,接觸Android的人又免不了要研究別人的App應用。Diggy,一款能夠從 apk 檔案中提取 endpoint 及 URL 的工具,只要一行命令就可以幫大家提取出相關Android apk檔案的安裝資訊和網際網路訪問資訊。下載地址:

資料庫讀取多張圖片並顯示在同一頁面

一開始想的是while(rs.next())迴圈讀取每張圖片並直接儲存在session中,傳到InputStream中,形成一張張圖片,後來發現InputStream物件被覆蓋了,意思是在同一頁面中顯

Java資料庫讀取Blob物件圖片並顯示

import java.sql.*; import java.io.*;   import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.image.AffineTransformOp; import j

網路獲取載入一個圖片

import java.io.BufferedInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection;

用PDFMinerPDF提取文本文字

dfp port 下載 span setup 技術分享 code with converter 1、下載並安裝PDFMiner   從https://pypi.python.org/pypi/pdfminer/下載PDFMineer wget https://pypi.p

oracle--導入數據(excel粘貼數據)

技術 ima KS 內容 添加 實際應用 http bubuko TE 如圖在要插入的內容前隨便添加一列非空的數據,選擇要粘貼的內容復制 在pl/sql 中 select xmmc,sqks from xm for update 像圖中步驟2 選中 然後

excel讀取用戶數據發送email

img info 發送郵件 可恥 mage color problem item sendmai from openpyxl import load_workbook import smtplib from email.mime.text import MIMEText

H.264SPS提取視頻寬高

ufs ase tel .html eva depth spl evel rip H.264有兩種封裝模式: (1)annexb模式:傳統模式,使用start code來分隔NAL, SPS和PPS是在ES流的頭部; (2)mp4模式:沒有start code,使用NALU

How to extract pcd from a rosbag? 如何rosbag提取pcd

disk div files org class ont int osb rac 4.1 bag_to_pcd Reads a bag file, saving all ROS point cloud messages on a specified topic as PCD

EXCEL提取GBIF上下載的物種座標資訊

資料——獲取外部資料——自文字——選擇下載的CSV 有些物種得分佈資料很大,首先要提取我所需要的地區資料——海南島 首先CTRL+A選中所有單元格,右鍵隱藏。第二步CTRL+F搜尋HAINAN,在搜尋結果處CTRL+A全選,關閉搜尋框,CTRL+SHIFT+9將選中的內容顯示出來。 下一步將顯示出的內容

Excel讀取點座標建立參照點

來自Revit SDK案例,  public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Autodesk.

【hive】url提取需要的部分字串

本人菜鳥一隻,如果有什麼說錯的地方還請大家批評指出!! 事情是這樣的,hive的A表中,有url這樣的一個欄位,我想要提取這個欄位中的某一部分(這不就是擷取字串嘛)。但是substring肯定是滿足不了我的需求的,自己寫hive的udf也不太現實(用最簡單的方式完成任務,才會讓後來的維護變得更加

Java基礎-----Excel獲取資料生成shell指令碼

前言 java讀取Excel的驅動包: 連結:https://pan.baidu.com/s/1ejCR9sS2OUmttFYpQnJkKQ 提取碼:58rm 實現1: 從Excel中讀取表名,由於每個欄位會對應一個表名,故讀取的某列會有若干個連續的表名出現,所以用set集合

ffmpeg 視訊提取WAV格式的音訊

步驟 1.下載ffmpeg 2.把下載回來的ffmpeg解壓後的bin目錄路徑新增到環境變數裡面的path裡面 3. ffmpeg -i .[迅雷下載xunbo.cc]愛情公寓第二季EP20.rmvb -f wav -ar 16000 2-20.wav 引數說明 -i

excel讀取時間

package com.cheche365.cheche.core.model import org.apache.poi.hssf.usermodel.HSSFCell import org.apache.poi.hssf.usermodel.HSSFRow import org.a