java中Excel导出echart图片
1、在生成echart的前端代码生成图片代码后Echart.setOption(captestRcapEchartOption, true);后面加上以下代码
//capImagesBase64是一个全局变量,因为后续传参也需要用到
capImagesBase64=capTestRcapEchart.getDataURL({
pixelRatio: 2,
backgroundColor: '#fff'
});
2、给echart的组件series设置属性animation: false(一定要设置,不然不能生成数据线)
3、把echart的base码通过ajax传到后端,ajax的data设置为
data:{
'imagesBase64':imagesBase64,
'curImagesBase64':curImagesBase64,
'capImagesBase64':capImagesBase64,},
4、以下是springboot的后端代码片段,在方法里要记到throws Exception
XSSFWorkbook wb = new XSSFWorkbook();
//创建sheet页
Sheet sheet = wb.createSheet("xkc报告");
//这个是创建excel的表格,因为图片前可能有其他的信息,具体看业务
Row myRow0 = sheet.createRow((short)0);
Cell bCel00 = myRow0.createCell(0);
bCel00.setCellValue("xkc:");
Cell bCel01 = myRow0.createCell(1);
bCel01.setCellValue("xkc");
//创建绘图(画布),一个sheet只能创建一个画布,但一个画布中可以添加多张图片
Drawing patriarch = sheet.createDrawingPatriarch();
//要进行非空处理,不然会报错
if(!request.getParameter("imagesBase64" ).equals("")&&request.getParameter("imagesBase64" )!=null){
//base码解码
String dataChartCostStr = (URLDecoder.decode(request.getParameter("imagesBase64" ).substring(22),"UTF-8")).replaceAll(" ", "+");
createPictureInExcel(dataChartCostStr, patriarch, wb, (short) 0, 8, (short) 10, 25);
}
if(request.getParameter("curImagesBase64" )!=null&& !request.getParameter("curImagesBase64" ).equals("")){
String curDataChartCostStr = (URLDecoder.decode(request.getParameter("curImagesBase64" ).substring(22),"UTF-8")).replaceAll(" ", "+");
createPictureInExcel(curDataChartCostStr, patriarch, wb, (short) 0, 25, (short) 10, 42);
}
if(request.getParameter("capImagesBase64" )!=null&& !request.getParameter("capImagesBase64" ).equals("")){
String capDataChartCostStr = (URLDecoder.decode(request.getParameter("capImagesBase64" ).substring(22),"UTF-8")).replaceAll(" ", "+");
createPictureInExcel(capDataChartCostStr, patriarch, wb, (short) 0, 42, (short) 10, 59);
}
//这里的filename是我传过来的,具体处理是fileName
String fileName = System.getProperty("webapp.root") + "slb"
+ File.separator + "report" + File.separator + "results"
+ File.separator + filename;
File file = new File(fileName);
//这段代码是设置给前端下载文件使用的,这个自己定义
response.setHeader("Content-disposition", "attachment;filename=" + HtmlUtils.htmlUnescape(fileName));
response.setContentType("application/msexcel;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
if (file.isFile()) {
file.delete();
}
// 规定的路径下,生成excel表格
FileOutputStream output = null;
try {
output = new FileOutputStream(fileName);
wb.write(output);
output.flush();
output.close();
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
try {
if (wb != null) {
wb.close();
}
if (output != null) {
output.close();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
5、定义具体画布的方法:
public void createPictureInExcel(String dataChart,Drawing patriarch,XSSFWorkbook wb,
short col1, int row1,short col2, int row2) throws Exception{
//用于将BASE64编码格式转为byte数组
BASE64Decoder base64Decoder = new BASE64Decoder();
ByteArrayOutputStream dataChartoutStream = new ByteArrayOutputStream();
//将dataChartStringin作为输入流,读取图片存入image中
ByteArrayInputStream dataChartin = new ByteArrayInputStream( base64Decoder.decodeBuffer(dataChart));
BufferedImage dataChartbufferImg = ImageIO.read(dataChartin);
//图片写入EXCEL
ImageIO.write(dataChartbufferImg, "png", dataChartoutStream);
/*
* 指定绘图区域位置及大小
* XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)
* 参数说明:
* dx1 dy1 起始单元格中的x,y坐标.
* dx2 dy2 结束单元格中的x,y坐标.
* col1,row1 指定起始的单元格,下标从0开始.
* col2,row2 指定结束的单元格 ,下标从0开始.
*/
XSSFClientAnchor anchorCostStr = new XSSFClientAnchor(0, 0, 0, 0, col1, row1, col2, row2);
//画图
patriarch.createPicture(anchorCostStr, wb.addPicture(dataChartoutStream.toByteArray(), XSSFWorkbook.PICTURE_TYPE_PNG));
}