【工作筆記】Java使用POI輸出圖片
阿新 • • 發佈:2018-12-09
最近接到需求,將一些資料資訊錄入到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如圖: