Java POI excel插入图片

本文介绍如何使用Java POI库在Excel文件中批量插入图片,包括读取Excel、创建图片对象、定位图片位置等关键步骤。
	

下面的例子是基于POI工具包, 对xlsx的excel进行修改的例子, 就是对原始excel再第7列插入了一列图片和每一条数据对应的.

图片插入部分注解比较详细, 这里不再写了.


	private static Map<String, File> getQRCode() {
		 Map<String, File> files = Maps.newHashMap();
		File f = new File("D:\\mnt\\sell\\qrcode500x500");
		File[] qrcodes = f.listFiles();
		for (File q : qrcodes) {
			files.put(q.getName().substring(0, q.getName().indexOf(".")), q);
		}
		return files;
	}
	
	
	/**
	 * 二维码贴入excel
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException {
		XSSFWorkbook  wb = new XSSFWorkbook(new FileInputStream(new File("D:\\mnt\\sell\\goods-information.xlsx")));
		XSSFSheet sheet = wb.getSheetAt(0);
		//sheet画图管理工具, 每个sheet维持一个
		XSSFDrawing patriarch = sheet.createDrawingPatriarch();
		//数据行数
		int n = sheet.getPhysicalNumberOfRows();
		
		Map<String, Integer> nameIndex = addPicture2Workbook(wb);
		String qrcodeName;
		for (int i = 1; i < n; i++) {
			qrcodeName = String.format("%s[%s]", sheet.getRow(i).getCell(0).getStringCellValue(),
					sheet.getRow(i).getCell(4).getStringCellValue());
			if (nameIndex.containsKey(qrcodeName)) {
				sheet.getRow(i).setHeightInPoints(150);//设置行高
				sheet.setColumnWidth(6, 30*256);//设置列宽, 第一个参数是列索引, 第二个是列宽单位是一个字符宽度的1/256, 这里相当于30字符宽度
				System.out.println("create picture :" + qrcodeName);
				//8个参数解释:  下面说的坐标是cell内坐标, cell中左上角为(x,y)->(0,0)位置
				//dx1 图片左上角所在x坐标  (起始cell)
				//dy1 图片左上角所在y 坐标  (起始cell)
				//dx2 图片右下角所在x坐标 (结束cell)
				//dy2 图片右下角所在y坐标 (结束cell)
				//col1 图片起始cell所在的列
				//row1 图片起始cell所在的行
				//col2 图片结束cell所在的列
				//row2 图片结束cell所在的行
				//下面图片左上角位于是第i行第6列, 右下角位于第i+1行第7列
				XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0,6, i, 7, i+1);
				anchor.setAnchorType(3);
				//插入图片, 第一个参数, 图片位置, 第二个参数是图片索引, 就是通过addPicture加入到webbook内的图片, 按照加入顺序, 
				//图片索引从0开始
				patriarch.createPicture(anchor, nameIndex.get(qrcodeName));
			}
		}
		//另存
		 FileOutputStream fileOut = new FileOutputStream(new File("D:\\mnt\\sell\\goods-2.xlsx"));
		 wb.write(fileOut);
		 fileOut.close();
	}
	private static Map<String, Integer> addPicture2Workbook(XSSFWorkbook wb) throws FileNotFoundException, IOException {
		Map<String, File> qr = getQRCode();
		Map<String, Integer> indx = Maps.newHashMap();
		int i = 0;
		for (Entry<String, File> kv : qr.entrySet()) {
			wb.addPicture(new FileInputStream(kv.getValue()), XSSFWorkbook.PICTURE_TYPE_PNG);
			indx.put(kv.getKey(), i);
			i++;
		}
		System.out.println("pictures : " + indx.size());
		return indx;
	}
	

在使用 Java POI 操作 Excel 文件时插入图片,主要依赖于 `HSSFPatriarch` 对象,它是用于在 Excel 中绘制图形的顶级管理器。插入图片的步骤可以概括为以下三个核心过程: 1. **获取 `HSSFPatriarch` 对象** 该对象是所有绘图操作的基础,通常通过 `HSSFSheet`(即工作表)来创建或获取。调用 `sheet.createDrawingPatriarch()` 方法即可获得 `HSSFPatriarch` 实例。 2. **创建 `HSSFClientAnchor` 对象** 该对象定义了图片Excel 中的位置和大小。它需要指定四个参数:起始、起始行、结束、结束行。这些参数决定了图片插入的具体单元格区域。例如: ```java HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 0, 0, (short) 2, 2); ``` 上述代码表示图片将从第 0 行第 0 开始,延伸到第 2 行第 2 ,同时控制图片在单元格内的相对位置[^1]。 3. **调用 `createPicture` 方法插入图片** 通过 `HSSFPatriarch` 的 `createPicture` 方法传入 `HSSFClientAnchor` 和图片的索引(`pictureIndex`),即可完成图片插入图片索引需通过 `HSSFWorkbook` 的 `addPicture` 方法添加图片流并返回。例如: ```java FileInputStream fileInputStream = new FileInputStream("path/to/image.png"); byte[] bytes = IOUtils.toByteArray(fileInputStream); int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG); patriarch.createPicture(anchor, pictureIdx); ``` 此处的 `pictureIdx` 是图片Excel 中的唯一标识,用于后续对图片的引用或操作[^1]。 ### 图片索引与锚点的关联 在 POI 中,`pictureIndex`、`ClientAnchor` 和 `pictureData` 是一一对应的关系。虽然 POI 提供了获取 `HSSFPicture` 的方法,但并没有直接将这三者绑定在一起。因此,在处理多个图片时,需自行维护它们之间的映射关系以确保逻辑清晰和操作准确[^2]。 ### Maven 依赖配置 为确保能够使用 POI 插入图片功能,需在项目中引入以下 Maven 依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 以上依赖支持 HSSF(Excel 2003)和 XSSF(Excel 2007 及以上)格式的操作,确保能够兼容不同版本的 Excel 文件[^3]。 ### 示例代码 以下是一个完整的示例,展示如何使用 POIExcel 插入图片: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ExcelImageInsertion { public static void main(String[] args) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Image Sheet"); // 获取绘图管理器 Drawing<?> drawing = sheet.createDrawingPatriarch(); // 定义图片位置 ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor(); anchor.setCol1(0); anchor.setRow1(0); anchor.setCol2(2); anchor.setRow2(2); // 读取图片并添加到工作簿 FileInputStream fileInputStream = new FileInputStream("path/to/image.png"); byte[] bytes = IOUtils.toByteArray(fileInputStream); int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG); Picture picture = drawing.createPicture(anchor, pictureIdx); // 保存工作簿 try (FileOutputStream fileOutputStream = new FileOutputStream("output.xlsx")) { workbook.write(fileOutputStream); } workbook.close(); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值