最近接到需求,将一些数据信息录入到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格式。