POI 将图片插入Excel的两种方式
前言
项目中有个需求,导出excel时需要根据URL将图片插入excel,通过查找,POI有个提供画图的工具可以将图片插入excel,在网上大致有两种方法可以实现该需求,两种方式本人都尝试,其中第一种方式更加容易、简单,第二种方式稍微复杂;个人更加倾向于第一种。
第一种:图片插入至单元格
这种方式很简单,直接将图片插入指定单元格,并设置图片的长宽的限制。
/**
*
* @Title: picture2
* @Description: 方法一:图片插入至单元格
* @author: zxfeng
* @date 2021年3月9日 下午2:25:30
* @param workbook workbook对象
* @param sheet 工作簿对象
* @param fileUrl URL
* @param row 第多少行
* @param col 第多少列
* @param scaleX X轴
* @param scaleY Y轴
* @version
*/
public static void picture2(XSSFWorkbook workbook, XSSFSheet sheet, String fileUrl, int row, int col, double scaleX, double scaleY) {
try {
//防止URL地址有中文,解码
String head = fileUrl.substring(0, fileUrl.lastIndexOf("/")+1);
String suffix = fileUrl.substring(fileUrl.lastIndexOf("/")+1);
String link = head + URLEncoder.encode(suffix,"UTF-8");
log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>拼接URL为:[{}]", link);
// 构造URL
URL url = new URL(link);
// 打开连接
URLConnection con = url.openConnection();
//设置请求超时为5s
con.setConnectTimeout(8 * 1000);
// 输入流
InputStream is = con.getInputStream();
byte[] bytes = IOUtils.toByteArray(is);
@SuppressWarnings("static-access")
int pictureIdx = workbook.addPicture(bytes, workbook.PICTURE_TYPE_PNG);
CreationHelper helper = workbook.getCreationHelper();
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
// 图片插入坐标
anchor.setCol1(col);
anchor.setRow1(row);
// 插入图片
Picture pict = drawing.createPicture(anchor, pictureIdx);
pict.resize(scaleX, scaleY);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
效果展示:
第二种:图片插入至坐标
这种方式稍微复杂点,将图片插入设置好的坐标,坐标的几个参数稍微复杂点,调试了半天图片达不到自己想要的效果,由于时间原因果断选择了第一种方式,感兴趣的小伙伴可以私信交流哈,互相学习一下!
/**
*
* @Title: picture
* @Description: 方法二:图片插入至坐标
* @author: zxfeng
* @date 2021年3月8日 下午5:37:33
* @param workbook
* @param sheet
* @param fileUrl
* @param fileType
* @param row
* @param col void
* @version
*/
public static void picture(XSSFWorkbook workbook, XSSFSheet sheet, String fileUrl, String fileType, int row, int col) {
try {
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
// 构造URL
URL url = new URL(fileUrl);
// 打开连接
URLConnection con = url.openConnection();
//设置请求超时为5s
con.setConnectTimeout(8 * 1000);
// 输入流
InputStream is = con.getInputStream();
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(is);
ImageIO.write(bufferImg, "JPEG", byteArrayOut);
bufferImg.flush();
byteArrayOut.flush();
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 255, 255,( short ) 0, 0, ( short ) 5, 8);
patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
} catch (Exception e) {
e.printStackTrace();
}
}