【工作笔记】Java使用POI输出图片

最近接到需求,将一些数据信息录入到Excel中,与以往不同的是,每条信息中有图片。搜索了POI相关,完成了此需求。

private HSSFWorkbook generateSnsPics(String gid, List<TerminalDailyData> list) throws IOException{
	HSSFWorkbook wb = new HSSFWorkbook();
	HSSFSheet sheet = wb.createSheet("sheet 1");
	// 设置单元格宽度
	for (int i = 0; i < 5; i++){
		sheet.setColumnWidth(i, 10 * 400);
	}
	sheet.setColumnWidth(4, 3675);
		
	// 标题格式
	CellStyle titleStyle = wb.createCellStyle();
	titleStyle.setDataFormat((short) 22);
		
	// 字体,黑色,加粗
	HSSFFont font = wb.createFont();
	font.setColor(HSSFColor.BLACK.index);
	font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		
	// 标题设置字体,设置水平居中
	titleStyle.setFont(font);
	titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
		
	// 单元格格式,水平居中,垂直居中
	CellStyle cellStyle = wb.createCellStyle();
	cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
	cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		
	// 表格标题
	String[] titles = new String[] {"序号", "商户名", "商户号", "终端号", "二维码" };
	HSSFRow headRow = sheet.createRow(0);
	for (int i = 0; i < titles.length; i++) {
		HSSFCell cell = headRow.createCell(i);
		cell.setCellValue(titles[i]);
		cell.setCellStyle(titleStyle);
	}
		
        // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 
        
	String content = "";
	TerminalDailyData t = new TerminalDailyData();
	int size = list.size();
	for (int i = 1; i <= size; i++) {
	    t = list.get(i - 1);
	    HSSFRow dataRow = sheet.createRow(i);
	    dataRow.setHeight((short) 1600);
			
	    HSSFCell cell0 = dataRow.createCell(0);
	    cell0.setCellValue("" + i);
	    cell0.setCellStyle(cellStyle);
			
	    HSSFCell cell1 = dataRow.createCell(1);
	    cell1.setCellValue(t.getMerchantName());
	    cell1.setCellStyle(cellStyle);
			
	    HSSFCell cell2 = dataRow.createCell(2);
	    cell2.setCellValue(t.getMid());
	    cell2.setCellStyle(cellStyle);
			
	    HSSFCell cell3 = dataRow.createCell(3);
	    cell3.setCellValue(t.getSn());
	    cell3.setCellStyle(cellStyle);
			
	    // 放置二维码图片
	    content = gid + "&" + t.getMid() + "&" + t.getSn();
	    BufferedImage bi = QRUtil.getRQ(content, 100);
	    ByteArrayOutputStream os = new ByteArrayOutputStream();// 新建流。
	    ImageIO.write(bi, "png", os); // 注:图片格式png,如果是jpg,图片会蒙上一层红色
	    byte b[] = os.toByteArray();
			
	    // anchor主要用于设置图片的属性
	    // HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)
	    // dx1左上角所在cell的偏移x坐标,一般可设0,范围值为:0~1023,超过1023就到右侧相邻的单元格里
	    // dy1左上角所在cell的偏移y坐标,一般可设0,范围值为:0~256,超过256就到下方的单元格里
	    // dx2右下角所在cell的偏移x坐标,一般可设0,范围值为:0~1023,超过1023就到右侧相邻的单元格里
	    // dy2右下角所在cell的偏移y坐标,一般可设0,范围值为:0~256,超过256就到下方的单元格里
	    // col1左上角所在列,row1左上角所在行
	    // col2右下角所在列,row2右下角所在行
	    HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 0, 0,(short) 4, i,(short) 5, i + 1);
	    //插入图片  
	    patriarch.createPicture(anchor, wb.addPicture(b,HSSFWorkbook.PICTURE_TYPE_PNG));
	        
	}
		
	return wb;
}

导出的Excel如图:

如果ImageIO.write(bi, "png", os);这里用"jpg",导出的Excel如图:

搜索了下,有相关文章:ImageIO.read()方法读取图片后重写,图片蒙上一层红色的解决办法
因为是生成二维码放入单元格,不是读取jpg格式的图片,所以这里换成了png格式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值