测试生成的jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Echarts图片生成wordDEMO</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px"></div> <!-- ECharts单文件引入 --> <script src="<%=basePath %>js/echarts-2.2.7/build/dist/echarts.js"></script> <script type="text/javascript"> // 路径配置 require.config({ paths: { echarts: '<%=basePath %>js/echarts-2.2.7/build/dist' } }); // 使用 require( [ 'echarts', 'echarts/chart/bar' // 使用柱状图就加载bar模块,按需加载 ], function (ec) { // 基于准备好的dom,初始化echarts图表 var myChart = ec.init(document.getElementById('main')); var option = { tooltip: { show: true }, legend: { data:['销量'] }, xAxis : [ { type : 'category', data : ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] } ], yAxis : [ { type : 'value' } ], series : [ { "name":"销量", "type":"bar", "data":[5, 20, 40, 10, 10, 20] } ] }; // 为echarts对象加载数据 myChart.setOption(option); setTimeout(exportImage, 2000); //exportImage(); var i=0; function exportImage(){ var data = "ImageData="+encodeURIComponent(myChart.getDataURL("png")); //图片名称 报告名称(与wordPath.properties 保持一致) //校验是否加载echarts if(data.indexOf("image")<0&&i<=3){ setTimeout(exportImage, 2000); i++; return; } var reportCode="safety_service_report"; var imageName="test1"; var params=data+"&reportCode="+reportCode+"&imageName="+imageName; if(data.indexOf("image")<0){ params+="&msg=ERROR" } var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("POST","<%=path%>/imageController/saveImage",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { alert("保存成功"); } } xmlhttp.send(params); } } ); </script> </body> </html> jsp2
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Echarts图片生成wordDEMO</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px"></div> <!-- ECharts单文件引入 --> <script src="<%=basePath %>js/echarts-2.2.7/build/dist/echarts.js"></script> <script type="text/javascript"> // 路径配置 require.config({ paths: { echarts: '<%=basePath %>js/echarts-2.2.7/build/dist' } }); // 使用 require( [ 'echarts', 'echarts/chart/bar' // 使用柱状图就加载bar模块,按需加载 ], function (ec) { // 基于准备好的dom,初始化echarts图表 var myChart = ec.init(document.getElementById('main')); var option = { tooltip: { show: true }, legend: { data:['销量'] }, xAxis : [ { type : 'category', data : ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] } ], yAxis : [ { type : 'value' } ], series : [ { "name":"销量", "type":"bar", "data":[5, 20, 40, 10, 10, 20] } ] }; // 为echarts对象加载数据 myChart.setOption(option); setTimeout(exportImage, 2000); //exportImage(); var i=0; function exportImage(){ var data = "ImageData="+encodeURIComponent(myChart.getDataURL("png")); //图片名称 报告名称(与wordPath.properties 保持一致) if(data.indexOf("image")<0&&i<=3){ setTimeout(exportImage, 2000); i++; return; } var reportCode="safety_service_report"; var imageName="test2"; var params=data+"&reportCode="+reportCode+"&imageName="+imageName; if(data.indexOf("image")<0){ params+="&msg=ERROR" } var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("POST","<%=path%>/imageController/saveImage",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { alert("保存成功"); } } xmlhttp.send(params); } } ); </script> </body> </html> 配置文件:WordPath.properties
#命名规则 #doc.*.DataPath doc.导出文档名称.用途 #doc.DataPath 生成word地址 #安全服务质量周报 doc.safety_service_report.DataPath=D\:\\DataPath\\safety_service_report\\ #翻译用 safety_service_report=************* #.ImageNames 报告可能有多个图片组合而成 以逗号分隔 在ImageNames配置 doc.safety_service_report.ImageNames=test1,test2 #生成word路径 doc.DataPath=D\:\\reportPath\\
ImageController.java
package com.taixin.sys.action; 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.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.taixin.utils.WordUtil; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; @Controller @RequestMapping("/imageController") public class ImageController{ private static final long serialVersionUID = 1L; @RequestMapping(value = "saveImage" ,method=RequestMethod.POST) protected void SaveImage( @Param("ImageData") String ImageData, @Param("reportCode") String reportCode,@Param("imageName") String imageName,@Param("msg") String msg) throws ServletException, IOException { if("ERROR".equals(msg)){ //log 记录日志 System.out.println("生成图片失败!!!"); return; } String buspath=WordUtil.prop.getProperty("doc."+reportCode+".DataPath"); //获取业务DOC存放地址 try { String[] url = ImageData.split(","); String u = url[1]; // Base64解码 byte[] b = new BASE64Decoder().decodeBuffer(u); String fileStr = WordUtil.saveFile(WordUtil.getApplicationPath(WordUtil.IMGPATH,buspath)); //保存到对应地址的image下 // 生成图片 OutputStream out = new FileOutputStream(new File(fileStr+"/"+imageName+".png")); out.write(b); out.flush(); out.close(); if(impect(reportCode)){//校验是否需要生成word 必须所有的图片加载完毕 ImageToDoc(reportCode);//生成word }; } catch (Exception e) { e.printStackTrace(); } //ImageToDoc(reportCode); } private boolean impect(String reportCode) { String imageNames=WordUtil.prop.getProperty("doc."+reportCode+".ImageNames"); String buspath=WordUtil.prop.getProperty("doc."+reportCode+".DataPath"); //获取业务DOC存放地址 String fileStr = WordUtil.saveFile(WordUtil.getApplicationPath(WordUtil.IMGPATH,buspath)); String [] arrs=imageNames.split(","); for(int z=0;z<arrs.length;z++){ String imagPath=fileStr+"\\"+arrs[z]+".png"; if(!new File(imagPath).exists()){ return false; } } return true; } public void ImageToDoc(String reportCode) throws UnsupportedEncodingException{ Map<String, Object> dataMap = new HashMap<String, Object>(); dataMap = getData(reportCode); //生产word WordUtil wordutil=new WordUtil(); String docName=new String(WordUtil.prop.getProperty(reportCode).getBytes("iso8859-1"),"utf-8"); wordutil.createWord(reportCode, WordUtil.prop.getProperty("doc.DataPath")+"\\"+docName+".doc", dataMap); } public static Map<String, Object> getData(String reportCode) { Map<String, Object> dataMap = new HashMap<String, Object>(); WordUtil wordUtil = new WordUtil(); //加载 String imageNames=WordUtil.prop.getProperty("doc."+reportCode+".ImageNames"); String buspath=WordUtil.prop.getProperty("doc."+reportCode+".DataPath"); //获取业务DOC存放地址 String fileStr = wordUtil.saveFile(WordUtil.getApplicationPath(WordUtil.IMGPATH,buspath)); String [] arrs=imageNames.split(","); for(int z=0;z<arrs.length;z++){ dataMap.put(arrs[z], getImageStr(fileStr+"\\"+arrs[z]+".png")); } insertParamsToMap(reportCode,dataMap); return dataMap; } private static void insertParamsToMap(String reportCode, Map<String, Object> dataMap) { // TODO Auto-generated method stub if(reportCode==""){ }else if(reportCode==""){ } } public static 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); } }
WordUtil.java
package com.taixin.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Map; import java.util.Properties; import sun.misc.BASE64Encoder; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class WordUtil { public static final String IMGPATH="img"; public static final String FTLPATH="ftl"; private Configuration configuration = null; public static Properties prop=null; static{ prop = new Properties(); InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("WordPath.properties"); try { prop.load(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public WordUtil() { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); } public void createWord(String reportCode, String filePathName, Map<String, Object> dataMap) { try { String buspath=WordUtil.prop.getProperty("doc."+reportCode+".DataPath"); //获取业务DOC存放地址 configuration.setDirectoryForTemplateLoading(new File(WordUtil.getApplicationPath(WordUtil.FTLPATH,buspath))); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } // FTL文件所存在的位置 Template t = null; try { // 获取模版文件 t = configuration.getTemplate(reportCode+".ftl"); } catch (IOException e) { e.printStackTrace(); } // 生成文件的路径和名称 File outFile = new File(filePathName); Writer out = null; try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile),"utf-8")); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { t.process(dataMap, out); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 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); } public static String saveFile(String path) { File tmp = new File(path); if (!tmp.exists()) { tmp.mkdirs(); } return path; } public static String getApplicationPath(String sourcepath,String busPath){ File tmp=null; String realPath=busPath+sourcepath; if(!(tmp=new File(realPath)).exists()){ tmp.mkdirs(); } return realPath; } public static void impectPath(String path){ File tmp=null; if(!(tmp=new File(path)).exists()){ tmp.mkdirs(); } } }
代码部分借鉴了一位网友的,在他基础上做了可配置多图片功能,有问题可以咨询。
下面是他的地址 http://blog.csdn.net/leolu007/article/details/50125295
可以看看freemaker模板的修改。