轉自:https://blog.csdn.net/weixin_44009447/article/details/105794496
引言:在實際項目統計報表模塊中,報表的內容不單單只有數據,用戶為了更能直觀的觀察數據,往往還提出將數據圖表導出到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效果圖如下所示:
————————————————
版權聲明:本文為CSDN博主「Keson Z」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44009447/article/details/105794496
使用Apache POI導出echarts圖表到Excel表格