前面介绍了导出到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
感谢各位看官的阅读,本仙女是帅帅的玉米,有什么问题请留言哦,以为有用的请赏赐个赞!!工具