引言:在实际项目统计报表模块中,报表的内容不单单只有数据,用户为了更能直观的观察数据,往往还提出将数据图表导出到excel的需求,比如数据柱状图、饼状图以及折线图等等。这些数据图形可以用echarts来进行动态实现,那么我们如何将echarts构建的图表导出到excel文件中呢?
本篇文章主要说明如何使用Apache POI导出echarts图表到Excel表格,详细导出数据步骤在我的另一篇博文中有:使用Apache POI导出数据到Excel表格,在这里就简单说明一下导出echarts图形的新添加的步骤以及代码,希望能对大家有所帮助。
1.首先我们要了解到导出echarts图表大概是一个什么样子的流程:得到echarts图表的base64编码→将该图表的base64编码解码得到图片文件→将该图片文件写入流中→最后将该图片画在excel画布上
注:(Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。)
2.echarts图表构建好之后,得到该图表的echarts编码,并传入后台,如下图所示:
3.控制器中去接收该数据,如下图所示:
4.相对于之前导出数据,导出echarts图表只是多传入了一个imgBase64Info参数,所以在导出的工具中,我们也需要添加一块构建echarts图表的代码,添加的代码如下所示:
添加的代码块:
/*将echarts数据生成图表*/
if(!StringUtils.isEmpty(imgUrl)) {
// 1)截取获取到的base64编码,去掉前缀"data:image/png;base64," || "data:image/jpeg;base64,",只取base64编码
String[] imgUrlArr = imgUrl.split("base64,");//拆分base64编码后部分
// 2)重点:在传 base64编码 的时候,会把 base64编码 中的 "+" 号换成空格,所以需要先将base64中的空格转换回来,再进行保存操作!!!
byte[] buffer = new BASE64Decoder().decodeBuffer(imgUrlArr[1].replaceAll(" ", "+"));
//生成图片保存路径
String picPath = "C:\\Users\\My\\Desktop\\echarts" + ".png";
File file = new File(picPath);//图片文件
try {
//生成图片
OutputStream out = new FileOutputStream(file);//图片输出流
out.write(buffer);
out.flush();//清空流
out.close();//关闭流
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); // 将图片写入流中
BufferedImage bufferImg = ImageIO.read(new File(picPath));
ImageIO.write(bufferImg, "PNG", outStream);
// 利用HSSFPatriarch将图片写入EXCEL
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
//short 宽度:0-12列,从第0列开始,到第12列结束
//row1-row2:高度:8-31列,从第12行开始,到第35行结束
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 0, 12, (short) 12, 35);
//画图
patriarch.createPicture(anchor, workbook.addPicture(outStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));
} catch (Exception ex) {
ex.printStackTrace();
}
if (file.exists()) {
file.delete();//删除图片
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
注意!!!
如上代码所示:在前后台传递base64编码的时候,会把 base64编码 中的 “+” 号换成空格,所以需要先将base64中的空格转换回来,再进行保存操作!!!
5.debug后控制台打印出该base64编码存在空格,会导致图片解编码失败,我就是因为这个问题搞了差不多一天,真的是血淋淋的教训!!!希望大家看了以后不要再重复犯这种错误!
6.没有把“ ”替换成“+”号会出现以下报错:
7.还有一个问题需要注意,因为base64编码过长,直接传入后台会出现以下请求头过长报错:
8.这个时候我们就需要在application.yml添加一行代码,重新定义请求头的大小,如下图所示:
9.执行完上述步骤后,我们就能把数据以及echarts数据图表都导出到excel表格中去了,页面效果图以及导出后的excel效果图如下所示:
————————————————