Echarts多张图片插入word解决方案

xiaoxiao2021-02-28  84

测试生成的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模板的修改。

转载请注明原文地址: https://www.6miu.com/read-54743.html

最新回复(0)