詳解 利用NPOI向Excel指定位置中加入圖片(支持.xlsx和.xls)

/*
     * Author:zhoukaikai
     * 注意:本項目中使用的NPOI版本爲 V2.4.1.0;需要在NuGet上添加NPOI包
     * 如果發現圖片位置錯誤 或 圖片不顯示,請先確認NPOI版本是否與本項目一致
     */
    class Program
    {
        static void Main(string[] args)
        {
            string excelPath = @"D:\利用NPOI向Excel指定位置中加入圖片\excel.xlsx";
            //string excelPath = @"D:\利用NPOI向Excel指定位置中加入圖片\excelXLS.xls";
            string imgPath = @"D:\利用NPOI向Excel指定位置中加入圖片\image.png";
            string fileExtensionName = Path.GetExtension(excelPath);
            if (fileExtensionName.ToLower() == ".xlsx")
            {
                InsertImageToXLSXExcel(excelPath, imgPath);
            }
            if (fileExtensionName.ToLower() == ".xls")
            {
                InsertImageToXLSExcel(excelPath, imgPath);
            }
        }

        /// <summary>
        /// .xlsx後綴的Excel文件添加圖片
        /// </summary>
        /// <param name="excelPath"></param>
        /// <param name="imgPath"></param>
        public static void InsertImageToXLSXExcel(string excelPath, string imgPath)
        {
            try
            {
                using (FileStream fs = new FileStream(excelPath, FileMode.Open))//獲取指定Excel文件流
                {
                    //創建工作簿
                    XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs);
                    //獲取第一個工作表(下標從0起)
                    XSSFSheet sheet = (XSSFSheet)xssfworkbook.GetSheet(xssfworkbook.GetSheetName(0));

                    //獲取指定圖片的字節流
                    byte[] bytes = System.IO.File.ReadAllBytes(imgPath);
                    //將圖片添加到工作簿中,返回值爲該圖片在工作表中的索引(從0開始)
                    //圖片所在工作簿索引理解:如果原Excel中沒有圖片,那執行下面的語句後,該圖片爲Excel中的第1張圖片,其索引爲0;
                    //同理,如果原Excel中已經有1張圖片,執行下面的語句後,該圖片爲Excel中的第2張圖片,其索引爲1;
                    int pictureIdx = xssfworkbook.AddPicture(bytes, PictureType.JPEG);

                    //創建畫布
                    XSSFDrawing patriarch = (XSSFDrawing)sheet.CreateDrawingPatriarch();
                    //設置圖片座標與大小
                    //函數原型:XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2);
                    //座標(col1,row1)表示圖片左上角所在單元格的位置,均從0開始,比如(5,2)表示(第五列,第三行),即F3;注意:圖片左上角座標與(col1,row1)單元格左上角座標重合
                    //座標(col2,row2)表示圖片右下角所在單元格的位置,均從0開始,比如(10,3)表示(第十一列,第四行),即K4;注意:圖片右下角座標與(col2,row2)單元格左上角座標重合
                    //座標(dx1,dy1)表示圖片左上角在單元格(col1,row1)基礎上的偏移量(往右下方偏移);(dx1,dy1)的最大值爲(1023, 255),爲一個單元格的大小
                    //座標(dx2,dy2)表示圖片右下角在單元格(col2,row2)基礎上的偏移量(往右下方偏移);(dx2,dy2)的最大值爲(1023, 255),爲一個單元格的大小
                    //注意:目前測試發現,對於.xlsx後綴的Excel文件,偏移量設置(dx1,dy1)(dx2,dy2)無效;只會對.xls生效
                    XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, 5, 2, 10, 3);
                    //正式在指定位置插入圖片
                    XSSFPicture pict = (XSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);

                    //創建一個新的Excel文件流,可以和原文件名不一樣,
                    //如果不一樣,則會創建一個新的Excel文件;如果一樣,則會覆蓋原文件
                    FileStream file = new FileStream(excelPath, FileMode.Create);
                    //將已插入圖片的Excel流寫入新創建的Excel中
                    xssfworkbook.Write(file);
                    
                    //關閉工作簿
                    xssfworkbook.Close();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// .xls後綴的Excel文件添加圖片
        /// </summary>
        /// <param name="excelPath"></param>
        /// <param name="imgPath"></param>
        public static void InsertImageToXLSExcel(string excelPath, string imgPath)
        {
            byte[] bytes = System.IO.File.ReadAllBytes(imgPath);
            try
            {
                using (FileStream fs = new FileStream(excelPath, FileMode.Open))
                {
                    HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);
                    HSSFSheet sheet = (HSSFSheet)hssfworkbook.GetSheet(hssfworkbook.GetSheetName(0));

                    int pictureIdx = hssfworkbook.AddPicture(bytes, PictureType.JPEG);

                    HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
                    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, 5, 2, 10, 3);//(255, 125, 1023, 150, 5, 2, 10, 3);//(0, 0, 0, 0, 5, 2, 10, 3);
                    HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);

                    FileStream file = new FileStream(excelPath, FileMode.Create);
                    hssfworkbook.Write(file);
                    hssfworkbook.Close();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章