引言:在实际项目统计报表模块中,报表的内容不单单只有数据,用户为了更能直观的观察数据,往往还提出将数据图表导出到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效果图如下所示:

 

 

 

————————————————



使用Apache POI导出echarts图表到Excel表格