功能使用点
最近公司需要开发一个数据表格导出excel的功能,普通的excel表格很好解决,网上有很多方法,下次写篇文章记录我的方法,但开发到有一个需求是excel是需要带图片的还是有些难度的,网上找了很多方案都无法适配,这里我记录下使用的方法。
这里最后是在这篇文章上进行了优化,优化点是不需要提前准备个模板了,直接在代码里生成需要的模板。
Java导出excel带图片(希望能帮助你们节省时间)_java导出excel能导出图片吗-CSDN博客
功能展示
功能代码展示
@ApiOperation(value = "治疗记录导出", notes = "治疗记录导出")
@PostMapping("/exportCureList")
public void exportCureList(HttpServletResponse response,@RequestBody CureListRo ro) throws Exception{
String userId = jwtUtil.getCurrentUser().getHisId();
Long customerId = jwtUtil.getCurrentUser().getCustomerId();
List<String> departmentIds= hsUserDepartmentMapper.selectList(new QueryWrapper<HsUserDepartment>()
.eq("user_id",userId).eq("customer_id", customerId))
.stream().map(HsUserDepartment::getDepartmentId).collect(Collectors.toList());
ro.setDepartmentIds(departmentIds);
ro.setCustomerId(customerId);
List<CureListVo> list = buSignatureService.exportCureList(ro);
if (ObjectUtil.isEmpty(list)){
throw new BusinessException("数据为空无法导出EXCEL");
}
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//创建excel流(从指定文件流)
XSSFWorkbook excel = new XSSFWorkbook();
//定义数据
XSSFSheet sheet = excel.createSheet("治疗记录");
XSSFRow row1 = sheet.createRow(0);
row1.createCell(0).setCellValue("患者姓名");
row1.createCell(1).setCellValue("手机号");
row1.createCell(2).setCellValue("门诊号");
row1.createCell(3).setCellValue("身份证号");
row1.createCell(4).setCellValue("开单科室");
row1.createCell(5).setCellValue("执行科室");
row1.createCell(6).setCellValue("开单医生");
row1.createCell(7).setCellValue("治疗师");
row1.createCell(8).setCellValue("治疗项目");
row1.createCell(9).setCellValue("是否签名");
row1.createCell(10).setCellValue("签名图片");
row1.createCell(11).setCellValue("治疗开始");
row1.createCell(12).setCellValue("治疗完成");
row1.createCell(13).setCellValue("合计金额");
//填充数据
for (int i = 0; i < list.size(); i++) {
//模板文件从第三行开始填
Row row = sheet.createRow(i+1);
//第一个单元格填排名
sheet.setColumnWidth(10, 20 * 256);
row.setHeight((short) (100*10));
row.createCell(0).setCellValue(list.get(i).getName());
row.createCell(1).setCellValue(list.get(i).getPhone());
row.createCell(2).setCellValue(list.get(i).getOutpatientId());
row.createCell(3).setCellValue(list.get(i).getIdcard());
row.createCell(4).setCellValue(list.get(i).getDepartmentName());
row.createCell(5).setCellValue(list.get(i).getImplDepartmentName());
row.createCell(6).setCellValue(list.get(i).getDoctor());
row.createCell(7).setCellValue(list.get(i).getTherapists());
row.createCell(8).setCellValue(list.get(i).getItems());
row.createCell(9).setCellValue(list.get(i).getIsSign());
if (ObjectUtil.isNotEmpty(list.get(i).getSign())){
if (list.get(i).getSign().contains("http")){
row.createCell(10).setCellValue(imgxx(list.get(i).getSign(),sheet,i,10,excel));
}else {
String sign = list.get(i).getSign();
String substring = sign.substring(22);
BufferedImage bufferedImage = base64ToBufferedImage(substring);
row.createCell(10).setCellValue(bufxx(bufferedImage,sheet,i,10,excel));
}
}
row.createCell(11).setCellValue(sf.format(list.get(i).getCureStartTime()));
row.createCell(12).setCellValue(sf.format(list.get(i).getCureEndTime()));
if (ObjectUtil.isNotEmpty(list.get(i).getTotalPrice())){
row.createCell(13).setCellValue(list.get(i).getTotalPrice().toString());
}else {
row.createCell(13).setCellValue(0);
}
}
//设置Content-Type为appl ication/vnd.openxmLformats -officedocument. spreadsheetmL. sheet
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//设置Content-Dispositiontattachment;filename-excel.xLsx,表示将文件下载到本地,并指定文件名为excel.xLsx
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("治疗记录", "UTF8") + ".xlsx");
// 通过输出流将Excel文件下载到客户端浏览器
ServletOutputStream out = response.getOutputStream();
excel.write(out);
out.flush();
//关闭资源
out.close();
excel.close();
}
XSSFWorkbook创建表格行,列,单元格部分代码比较简单,看代码大概可以看懂,又不懂的可以私信我,我和你讲解,这里重点是保存图片单元格的方法,具体代码如下
private String imgxx(String img, Sheet sheet,int i,int j,Workbook excel){
URL photoFile = null;
try {
photoFile = new URL(img);
// 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//将图片读入BufferedImage对象
BufferedImage bufferImg = ImageIO.read(photoFile);
// 将图片写入流中
ImageIO.write(bufferImg, "png", byteArrayOut);
// 利用HSSFPatriarch将图片写入EXCEL
Drawing<?> patriarch = sheet.createDrawingPatriarch();
// 图片一导出到单元格I3-5中 列开始:8 行开始:2 列结束:9 行结束:5
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, j, i + 1, j, i + 1);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
// 插入图片内容
Picture picture = patriarch.createPicture(anchor, excel.addPicture(byteArrayOut
.toByteArray(), XSSFWorkbook.PICTURE_TYPE_PNG));
picture.resize(1,1);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
一般来说有上面一个网址解析图片的方法就足够了,但我们需求是要对于网址和base64的存储都可以进行展示,所以对上诉方法进行了一个改造,也支持base64格式的图片,代码如下。
private String bufxx(BufferedImage bufferImg, Sheet sheet,int i,int j,Workbook excel){
try {
// 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//将图片读入BufferedImage对象
// 将图片写入流中
ImageIO.write(bufferImg, "png", byteArrayOut);
// 利用HSSFPatriarch将图片写入EXCEL
Drawing<?> patriarch = sheet.createDrawingPatriarch();
// 图片一导出到单元格I3-5中 列开始:8 行开始:2 列结束:9 行结束:5
XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, j, i + 1, j, i + 1);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
// 插入图片内容
Picture picture = patriarch.createPicture(anchor, excel.addPicture(byteArrayOut
.toByteArray(), XSSFWorkbook.PICTURE_TYPE_PNG));
picture.resize(1,1);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
实现效果
标签:Java,get,导出,excel,list,createCell,setCellValue,row From: https://blog.csdn.net/m0_73774439/article/details/144138022