/*
* 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);
}
}
}