前面介紹了導出到word的代碼實現,詳見這裏,裏面有一部分涉及導出圖片到word,在這裏我再另外作一個詳細的介紹。
是這樣的,我項目有個功能,裏面就涉及到要將echarts造成的柱狀圖或者地圖之類的圖表導出到word,在網上找了好久,都是說將圖片轉成base64編碼後傳給後臺解碼,但沒有一篇有詳細具體的介紹,通過不斷的摸索,終於實現了,在這裏給你們作個分享。javascript
處理步驟:
(1)圖片咱們能夠在前臺將要的圖片轉成base64編碼,而後提交給後臺接收
(2)後臺接收base64編碼後使用工具類將base64解碼成圖片而後保存到本地中
(3)在要導出word的時候讀取下本地存儲圖片的路徑而後把圖片導出來就好了。java
一、在前臺用js將echarts生成的圖片轉成base64編碼,提交給後臺。json
<script type="text/javascript"> //定義柱狀圖圖片base64編碼的全局變量 var barBase64Info; function echar(){//柱狀圖 var myChart = echarts.init(document.getElementById('histogram')); $.post('...',{},function (data) { //... var option = { //... }; myChart.setOption(option); //用getDataURL()將柱狀圖轉義成base64編碼賦給全局變量 barBase64Info = myChart.getDataURL(); }, 'json'); } //下面根據大家本身的代碼,點擊按鈕的時候將barBase64Info同時提交給後臺接收就好了 </script>
二、下面就是使用工具類在後臺對圖片進行處理,工具類以下:segmentfault
package com.*.util; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; import javax.imageio.ImageIO; import Decoder.BASE64Decoder; import Decoder.BASE64Encoder; /** * 類名稱:ImageUtil * 類描述:圖片處理工具類 */ public class ImageUtil { /** * 從path這個地址獲取一張圖片而後轉爲base64碼 * @param imgName 圖片的名字 如:123.png(是帶後綴的) * @param path 123.png圖片存放的路徑 * @return * @throws Exception */ public static String getImageFromServer(String imgName,String path)throws Exception{ BASE64Encoder encoder = new BASE64Encoder(); File f = new File(path+imgName); if(!f.exists()){ f.createNewFile(); } BufferedImage bi = ImageIO.read(f); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bi, "png", baos); byte[] bytes = baos.toByteArray(); return encoder.encodeBuffer(bytes).trim(); } /** * 將一個base64轉換成圖片保存在 path文件夾下 ,命名隨機 * @param base64String * @param path 是一個文件夾路徑 * @param imgName 圖片名字(沒有後綴) * @throws Exception */ public static String savePictoServer(String base64String,String path)throws Exception{ BASE64Decoder decoder = new BASE64Decoder(); //要把+在上傳時變成的空格再改成+ base64String = base64String.replaceAll(" ", "+"); //去掉「data:image/png;base64,」後面纔是base64編碼,去掉以後才能解析 base64String = base64String.replace("data:image/png;base64,",""); //在本地指定位置創建文件夾,path由控制檯那邊進行定義 String realPath = path+"/"+"echarts"; File dir=new File(realPath); if(!dir.exists()){ dir.mkdirs(); } String fileName=path+"\\"+"echarts"+"\\"+UUID.randomUUID().toString()+".png"; try { byte[] buffer = decoder.decodeBuffer(base64String); OutputStream os = new FileOutputStream(fileName); for(int i =0;i<buffer.length;++i){ if(buffer[i]<0){//調整異常數據 buffer[i]+=256; } } os.write(buffer); os.close(); } catch (IOException e) { throw new RuntimeException(); } return fileName; } /** * 讀取圖片在本地存儲的位置 * @param imgFile * @throws Exception */ public String getImageStr(String imgFile) { InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); } }
三、最後一步就是控制檯方法如何處理圖片導出到word了,參照上一篇文章的第三步echarts
到這裏個人freemaker導出word系列就分享完畢咯。dom
感謝各位看官的閱讀,本仙女是帥帥的玉米,有什麼問題請留言哦,以爲有用的請賞賜個贊!!工具