前面介紹了匯出到word的程式碼實現,詳見這裡,裡面有一部分涉及匯出圖片到word,在這裡我再另外做一個詳細的介紹。
是這樣的,我專案有個功能,裡面就涉及到要將echarts形成的柱狀圖或者地圖之類的圖表匯出到word,在網上找了很久,都是說將圖片轉成base64編碼後傳給後臺解碼,但沒有一篇有詳細具體的介紹,經過不斷的摸索,終於實現了,在這裡給大家做個分享。
處理步驟:
(1)圖片我們可以在前臺將要的圖片轉成base64編碼,然後提交給後臺接收
(2)後臺接收base64編碼後使用工具類將base64解碼成圖片然後儲存到本地中
(3)在要匯出word的時候讀取下本地儲存圖片的路徑然後把圖片匯出來就行了。
1、在前臺用js將echarts生成的圖片轉成base64編碼,提交給後臺。
<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>
2、下面就是使用工具類在後臺對圖片進行處理,工具類如下:
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);
}
}
3、最後一步就是控制檯方法如何處理圖片匯出到word了,參照上一篇文章的第三步
到這裡我的freemaker匯出word系列就分享完畢咯。
感謝各位看官的閱讀,本仙女是帥帥的玉米,有什麼問題請留言哦,覺得有用的請賞賜個贊!!