1、Excel导出图片需求背景
最近在做一个项目,是针对考试人员需要拍照,然后把拍照的照片导出到Excel之中,经过试验确实可以导出到Excel之中,但是实用性不强,如果一场考试50个人计算,一个人拍摄照片3张,平均一张照片2M,2*3*50就至少有300M的大小了,并且图片长宽过大在Excel也不太适合展示,并且就算导出后这个Excel文件过大;导致打开文件过慢。所以导出图片到Excel适合于一般的用户基本信息,如果个人一寸照片等等。针对此方案我们决定采用后续所说的导出图片的访问地址Url,并格式化可以直接点击链接访问图片。
1.1 导出图片到Excel之中, 插入图片至坐标
相关方法参数说明
// 关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数,
有必要在这里说明一下:
// dx1:起始单元格的x偏移量,// dy1:起始单元格的y偏移量,
// dx2:终止单元格的x偏移量,// dy2:终止单元格的y偏移量,
// col1:起始单元格列序号,从0开始计算;// row1:起始单元格行序号,从0开始计算,
// col2:终止单元格列序号,从0开始计算;// row2:终止单元格行序号,从0开始计算,
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File(strAppRootPath + "images/" + "bxlogo.png"));
ImageIO.write(bufferImg, "png", byteArrayOut);
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 150, 1000, 210, (short) 0, 0, (short) 1, 1);
patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));
1.2 导出图片到Excel之中, 插入图片至单元格,以及另一种图片载入方法
// 插入 PNG 图片至 Excel
String fileName = strAppRootPath + "images/" + "bxlogo.png";
InputStream is = new FileInputStream(fileName);
byte[] bytes = IOUtils.toByteArray(is);
int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
CreationHelper helper = workbook.getCreationHelper();
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
// 图片插入坐标
anchor.setCol1(0);
anchor.setRow1(1);
// 插入图片
Picture pict = drawing.createPicture(anchor, pictureIdx);
pict.resize();
其中可以在网络上下载图片以实现方式可以参考此文章
获取网络中的图片资源
2、Excel导出的Url为超链接目的
如前文所说,如果导出的图片过大,可以考虑使用其他方法导出连接的地址。但是需要设置Excel单元的连接方式
HSSFCell photoCell=rowIndex.createCell(7+j);
photoCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
photoCell.setCellFormula("HYPERLINK(\"" +wholePhotoUrl+ "\")");
现在超链接单元格看起来和一般的单元格没有分别, 除非你把鼠标放上去才会变成手行光标。
为了和一般的习惯相符, 还需要把字符颜色变成蓝色和加上下划线。 这就要用到 style了、
HSSFCellStyle linkStyle = workbook.createCellStyle();
HSSFFont cellFont= workbook.createFont();
cellFont.setUnderline((byte) 1);
cellFont.setColor(HSSFColor.BLUE.index);
linkStyle.setFont(cellFont);
//最后把style应用到cell上去就大功告成了。
cell.setCellStyle(linkStyle);
参考文章:Apache POI 插入图片至 Excel 的两种方法 JAVA中读取网络中的图片资源导入到EXCEL中