1. 程式人生 > >【工作筆記】Java使用POI輸出圖片

【工作筆記】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如圖: