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

引言:在实际项目统计报表模块中,报表的内容不单单只有数据,用户为了更能直观的观察数据,往往还提出将数据图表导出到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编码,并传入后台,如下图所示:
使用Apache POI导出echarts图表到Excel表格_第1张图片
3.控制器中去接收该数据,如下图所示:
在这里插入图片描述
使用Apache POI导出echarts图表到Excel表格_第2张图片
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();//删除图片
            }
        }

注意!!!

如上代码所示:在前后台传递base64编码的时候,会把 base64编码 中的 “+” 号换成空格,所以需要先将base64中的空格转换回来,再进行保存操作!!!

5.debug后控制台打印出该base64编码存在空格,会导致图片解编码失败,我就是因为这个问题搞了差不多一天,真的是血淋淋的教训!!!希望大家看了以后不要再重复犯这种错误!
使用Apache POI导出echarts图表到Excel表格_第3张图片

6.没有把“ ”替换成“+”号会出现以下报错:
使用Apache POI导出echarts图表到Excel表格_第4张图片
7.还有一个问题需要注意,因为base64编码过长,直接传入后台会出现以下请求头过长报错:
使用Apache POI导出echarts图表到Excel表格_第5张图片
8.这个时候我们就需要在application.yml添加一行代码,重新定义请求头的大小,如下图所示:在这里插入图片描述
9.执行完上述步骤后,我们就能把数据以及echarts数据图表都导出到excel表格中去了,页面效果图以及导出后的excel效果图如下所示:
使用Apache POI导出echarts图表到Excel表格_第6张图片
使用Apache POI导出echarts图表到Excel表格_第7张图片
使用Apache POI导出echarts图表到Excel表格_第8张图片

你可能感兴趣的:(Java后台,excel,java,base64)