echarts图形导出到excel

前台使用的为:extjs+echarts

定义了一个panel

                             {
                                    xtype: 'panel',
                                    name: 'parentChartPanel',
                                    id: 'parentChartPanel',
                                    columnWidth: 0.5,
                                    layout: 'fit',
                                    height: 287
                                }

然后就可以通过 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成图形

lateGaugePanel = echarts.init(document.getElementById('parentChartPanel'));
        var leakOption = {
            tooltip : {
                formatter: "{a} <br/>{b} : {c}%"
            },
            toolbox: {
                show : true
            },
            series : [
                {
                    name:'漏报',
                    type:'gauge',
                    detail : {
                        formatter:'{value}%',
                        fontSize:14
                    },
                    min:0,
                    max:10,
                    data:[{
                        value: result.leak,
                        name: '漏报'
                    }]
                }
            ]
        };
        leakGaugePanel.setOption(leakOption, true);

       //获取base64编码
        leakGaugePanelBase64 = leakGaugePanel.getDataURL();

将其传递到后台

                       Ext.Ajax.request({
                                    url: 'exportReportInfo.do?f=*.R0116&ssId=' + ssId,
                                    method: 'POST',
                                    form: 'export',
                                    params: {
                                        leakGaugePanelBase64: leakGaugePanelBase64
                                    },
                                    isUpload: true
                                })

后台接收:

    @RequestMapping(value = "exportReportInfo.do", params = "f=*.R0116")
    public void exportReportInfo(HttpServletResponse response, @RequestParam Map<String, String> map) {
        Map<String, String> infoMap = taskManagerService.getFrequenceAndBatchByTask(map);
      
        reportUpStateService.exportReportInfoNew(response, map, fileName);
    }

传递到后台的base64格式的为:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUsAAAEfCAYAAADIqOR/AAAgAElEQVR4Xu2dCVRUR9bH/9UNyCaCCuIe931BQcEFNUZjTGIUE7MYjSwmk03MOhG/JM4kQmaSiWJmMklkMXtGI2Yxixo1boCi4L7vu6LggohAd32nHoKITffr7tevu+n7

所以需要将“data:image/png;base64,”截取掉 

( 发送的时候使用URLEncoder.encode编码,接收的时候使用URLDecoder.decode解码,都按指定的编码格式进行编码、解码,可以保证不会出现乱码 )

 String dataChartString = URLDecoder.decode(map.get("leakGaugePanelBase64").substring(22),"UTF-8");

有一点必须注意:数据中的 "+"会因为传递变为 " "空格。

 dataChartString = dataChartString.replaceAll(" ", "+");

 

            OutputStream  out = response.getOutputStream();
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet(“测试图片导出”);

            //创建绘图
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

            BASE64Decoder base64Decoder = new BASE64Decoder();
            ByteArrayOutputStream dataChartStringoutStream = new ByteArrayOutputStream();
            ByteArrayInputStream dataChartStringin = new ByteArrayInputStream( base64Decoder.decodeBuffer(dataChartString));    //将picInfoByte作为输入流;
            BufferedImage dataChartStringbufferImg = ImageIO.read(dataChartStringin);     //将dataChartStringin作为输入流,读取图片存入image中
            ImageIO.write(dataChartStringbufferImg, "png", dataChartStringoutStream); // 利用HSSFPatriarch将图片写入EXCEL

 // 左上角第一列,第几行,右上角第几列,第几行

            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 100, 100, (short) 0, length + 1, (short) 5, length + 12);

            anchor.setAnchorType(3);
            patriarch.createPicture(anchor, wb.addPicture(dataChartStringoutStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));

            response.setContentType("application/excel");
            response.addHeader("Content-Disposition", "attachment;filename=" + new String( (fileName+".xls").getBytes("gb2312"), "ISO8859-1" ));
            wb.write(out);

 

最后记得关掉流

 

导出图片

echarts图形导出到excel