FreeMarker生成word的代码

    xiaoxiao2023-08-23  121

    

    用于生成word用的freemarker工具类

    package com.ucap.netcheck.utils;

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map;

    import com.thoughtworks.xstream.core.util.Base64Encoder;

    import freemarker.template.Configuration; import freemarker.template.Template;

    /**  * @Title: FreeMarkerUtil.java  * @Package com.ucap.netcheck.utils  * @Description: FreeMarker工具类  * @author Zuoquan Tu  * @date 2015-4-5 下午6:02:11  * @version V1.0  */ public class FreeMarkerUtil {  private static Configuration configuration = null;  private static Map<String, Template> allTemplates = null;    static {   configuration = new Configuration();   configuration.setDefaultEncoding("utf-8");   //configuration.setClassForTemplateLoading(FreeMarkerUtil.class,   //  "../template");      try {    configuration.setDirectoryForTemplateLoading(      new File(TemplateUtil.reportTemplatePath));   } catch (IOException e1) {    e1.printStackTrace();   }   allTemplates = new HashMap<String, Template>();   try {    allTemplates.put("word",configuration.getTemplate(TemplateUtil.templateFileName));   } catch (Exception e) {    e.printStackTrace();    throw new RuntimeException(e);   }  }    public FreeMarkerUtil() {     }    public static File createDoc(Map<?, ?> dataMap,String type){   String name = "temp" + (int) (Math.random() * 100000) + ".doc";   File f = new File(name);   Template t = allTemplates.get(type);   try {    // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word    //文档会因为有无法识别的编码而无法打开    Writer w = new OutputStreamWriter(new FileOutputStream(f),"utf-8");    t.process(dataMap, w);    w.close();   } catch (Exception ex) {    ex.printStackTrace();    throw new RuntimeException();   }   return f;  }

     public static String getImageString(String fileName) throws IOException {   InputStream in = null;   byte[] data = null;   try {    in = new FileInputStream(fileName);    data = new byte[in.available()];    in.read(data);    in.close();   } catch (Exception e) {    e.printStackTrace();   } finally {    if (in != null){     in.close();    }   }   Base64Encoder encoder = new Base64Encoder();   return data != null ? encoder.encode(data) : "";  } }

    生成word用的springMVC代码

    package com.ucap.netcheck.controller;

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Map;

    import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;

    import com.ucap.netcheck.entity.User; import com.ucap.netcheck.service.IReport2WordService; import com.ucap.netcheck.utils.DateUtil; import com.ucap.netcheck.utils.FreeMarkerUtil;

    /**  * @Title: Report2WordController.java  * @Package com.ucap.netcheck.controller  * @Description: 生成word部分的Controller  * @author Zuoquan Tu  * @date 2015-4-12 上午9:36:43  * @version V1.0  */ @Controller @RequestMapping(value = "/reportToWord", method = { RequestMethod.GET,   RequestMethod.POST }) public class Report2WordController {

     @Autowired  private IReport2WordService report2WordService;

     @RequestMapping(value = "/word")  public String outWord(Model model, HttpServletRequest request,    HttpServletResponse response) throws Exception {   request.setCharacterEncoding("utf-8");

      // 获取innerUUID,taskId   String siteCode = request.getParameter("innerUUID");   // 获取taskId   Integer taskId = Integer.parseInt(request.getParameter("taskId"));   // 获取用户的userId   User user = (User) request.getSession().getAttribute("user");   // 通过下面的方式获得模板的参数   Map<String, Object> map = report2WordService     .generateWordData(siteCode, taskId, user.getId());

      

      // 获取innerUUID,taskId   //Map<String, Object> map = new HashMap<String, Object>();

       //获取innerUUID,taskId //   Map<String, Object> map = new HashMap<String, Object>(); //   map.put("taskNum", "测试"); //   map.put("tackRunNum", "测试2……rqwrqw"); //   String imageStr = new FreeMarkerUtil().getImageString("D:/1.png"); //   map.put("imgStr", imageStr); //   //   List<CheckService> newsList = new ArrayList<CheckService>(); //   for (int i = 0; i < 10; i++) { //   CheckService checkService = new CheckService(); //   checkService.setTaskRunNum(10); //   checkService.setTaskNum(1000); //   newsList.add(checkService); //   } //   map.put("newList", newsList);

      this.generateWord(response, map);

      return null;  }    private void generateWord(HttpServletResponse response,    Map<String, Object> map) throws FileNotFoundException, IOException {   File file = null;   InputStream fin = null;   ServletOutputStream out = null;   try {    // 调用工具类WordGenerator的createDoc方法生成Word文档    file = new FreeMarkerUtil().createDoc(map, "word");    fin = new FileInputStream(file);    response.setCharacterEncoding("utf-8");    response.setContentType("application/msword");    // 设置浏览器以下载的方式处理该文件默认名为下面的文件,按照时间来生成的一个文件名称    String longMsDateStr = DateUtil.getStringLongMsDate();    response.addHeader("Content-Disposition","attachment;filename="+longMsDateStr+".doc");        out = response.getOutputStream();    byte[] buffer = new byte[512];    int bytesToRead = -1;

       // 通过循环将读入的Word文件的内容输出到浏览器中    while ((bytesToRead = fin.read(buffer)) != -1) {     out.write(buffer, 0, bytesToRead);    }   } finally {    if (fin != null)     fin.close();    if (out != null)     out.close();    if (file != null)     file.delete(); // 删除临时文件   }  } }

    Service代码

    package com.ucap.netcheck.service;

    import java.util.Map;

    /**    * @Title: Report2WordService.java  * @Package com.ucap.netcheck.service  * @Description: 用户生成word的报告的service接口  * @author Zuoquan Tu  * @date 2015-4-12 上午9:43:25  * @version V1.0    */ public interface IReport2WordService {    /**   * generateWordData(通过这个方法获得生成报告所需的数据)   *   * @Title: generateWordData   * @Description: 通过这个方法获得生成报告所需的数据   * @param @return    返回所需的数据   * @return Map<String,Object>    返回的数据   * @throws   */  public Map<String, Object> generateWordData(    String siteCode,Integer taskId,String userId);   }

    package com.ucap.netcheck.service.impl;

    import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

    import com.ucap.netcheck.combination.beans.TargetTypeParentToChildBean; import com.ucap.netcheck.common.GenerateKey; import com.ucap.netcheck.dao.IReport2WordDao; import com.ucap.netcheck.entity.CheckService; import com.ucap.netcheck.entity.MainPageScanFail; import com.ucap.netcheck.entity.MainPageScanResult; import com.ucap.netcheck.entity.ProblemInfo; import com.ucap.netcheck.entity.Site; import com.ucap.netcheck.service.CheckServiceService; import com.ucap.netcheck.service.IReport2WordService; import com.ucap.netcheck.service.ISingleRejectResultService; import com.ucap.netcheck.service.ISiteService; import com.ucap.netcheck.service.TargetTypeService; import com.ucap.netcheck.utils.DateUtil;

    /**    * @Title: Report2WordServiceImpl.java  * @Package com.ucap.netcheck.service.impl  * @Description:  * @author   * @date 2015-4-12 上午11:58:09  * @version V1.0    */ @Service public class Report2WordServiceImpl implements IReport2WordService {

     @Autowired     private ISiteService siteService;  @Autowired  private CheckServiceService checkServiceService;  @Autowired  private IReport2WordDao report2WordDao;  @Autowired  private TargetTypeService targetTypeService;  @Autowired  private ISingleRejectResultService singleRejectResultService;

     /**   * generateWordData(通过这个方法获得生成报告所需的数据)   * TODO   *   * @Title: generateWordData   * @Description: 通过这个方法获得生成报告所需的数据   * @param @return    返回所需的数据   * @return Map<String,Object>    返回的数据   * @throws   */  @Override  public Map<String, Object> generateWordData(    String siteCode,Integer taskId,String userId) {   Map<String, Object> map = new HashMap<String, Object>();   //网站名称,首页网址,报告编号,报告日期   Site site = siteService.findSite(siteCode);   map.put("site", site);   //生成报告编号和报告日期   map.put("reportCode", GenerateKey.generateKeyByDate(6));   map.put("reportDate", DateUtil.getYearMonthAndDay());      //检查方法的数据,获得CheckService的值   CheckService checkService = report2WordDao.findCheckService(userId);   map.put("checkService", checkService);   //设置开通时间的日期   map.put("checkServiceOpenTime", DateUtil.dateToStr(checkService.getOpenTime()));   //设置结束时间的日期   map.put("checkServiceCloseTime", DateUtil.dateToStr(checkService.getCloseTime()));      //问题统计部分的数据   List<TargetTypeParentToChildBean> targetTypeBeanStatistics =     targetTypeService.getTargetTypeByParentId(siteCode, taskId);   map.put("targetTypeBeanStatistics", targetTypeBeanStatistics);      //----------------------------------------------------------------------------------   //单项否决部分的问题   //获取站点无法访问的数据,获取单项否决权的数据   //下面是单项否决部分的代码   MainPageScanResult mainPageScanResult =     singleRejectResultService.queryMainPageScanResultUnique(siteCode,taskId);   map.put("mainPageScanResult", mainPageScanResult);   if (null != mainPageScanResult && mainPageScanResult.getFailNum() >= 0 && mainPageScanResult.getSuccessNum() >= 0) {    NumberFormat format = NumberFormat.getNumberInstance();    format.setMaximumFractionDigits(2);    double rate = mainPageScanResult.getFailNum() / mainPageScanResult.getSuccessNum();    String mainPageFailRateString = format.format(rate);    map.put("mainPageFailRateString", mainPageFailRateString);   } else {    map.put("mainPageFailRateString", "");   }      List<MainPageScanFail> queryMainPageScanFailList = new ArrayList<MainPageScanFail>();   if (null != mainPageScanResult) {    queryMainPageScanFailList = singleRejectResultService.queryMainPageScanFailListById(mainPageScanResult.getId());   }   map.put("queryMainPageScanFailList", queryMainPageScanFailList);    //  List<MainPageScanResult> mainPageScanResults = //    singleRejectResultService.queryMainPageScaneResultByCondition(siteCode,taskId); //  map.put("mainPageScanResults", mainPageScanResults);      //获取网站不更新的数据   List<Object[]> MainPageUpdateInfoLists = singleRejectResultService.queryMainPageUpdateResultByCondition(siteCode,taskId);   map.put("MainPageUpdateInfoLists", MainPageUpdateInfoLists);      //获取栏目不更新   List<ProblemInfo> problemInfoUnUpdate = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 4);   map.put("problemInfoUnUpdate", problemInfoUnUpdate);      //严重错误   List<ProblemInfo> problemInfoSeriousError = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 5);   map.put("problemInfoSeriousError", problemInfoSeriousError);      //互动回应差   List<ProblemInfo> problemInfoInterAct = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 6);   map.put("problemInfoInterAct", problemInfoInterAct);      //----------------------------------------------------------------------------------   //网站可用性   //1、首页可用性   List<ProblemInfo> problemInfoIndexUsability = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 8);   map.put("problemInfoIndexUsability", problemInfoIndexUsability); // //  //连接可用性 //  List<ProblemInfo> problemInfoLinkUsability = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 9); //  map.put("problemInfoLinkUsability", problemInfoLinkUsability);      //-----------------------------------------------------------------------------------   //信息更新情况   //首页栏目   List<ProblemInfo> problemInfoIndexColumn = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 11);   map.put("problemInfoIndexColumn", problemInfoIndexColumn);      //基本信息   List<ProblemInfo> queryCheckProblemInfoBaseInfo = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 12);   map.put("queryCheckProblemInfoBaseInfo", queryCheckProblemInfoBaseInfo);      //-----------------------------------------------------------------------------------   //互动回应情况   //政务咨询类栏目   List<ProblemInfo> problemInfoGovAdvisory = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 14);   map.put("problemInfoGovAdvisory", problemInfoGovAdvisory);

      //调查集体类栏目   List<ProblemInfo> problemInfoSurvey = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 15);   map.put("problemInfoSurvey", problemInfoSurvey);      //互动访谈类栏目   List<ProblemInfo> problemInfoInterview = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 16);   map.put("problemInfoInterview", problemInfoInterview);

      //-----------------------------------------------------------------------------------   //服务使用情况   //办事指南   List<ProblemInfo> problemInfoServiceUsedInfo = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 18);   map.put("problemInfoServiceUsedInfo", problemInfoServiceUsedInfo);      //附件下载   List<ProblemInfo> problemInfoAccessory = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 19);   map.put("problemInfoAccessory", problemInfoAccessory);     //在线系统   List<ProblemInfo> problemInfoOnLineInfo = report2WordDao.queryCheckProblemInfo(taskId, siteCode, 20);   map.put("problemInfoOnLineInfo", problemInfoOnLineInfo);      return map;  }

    }

    关于错误总结:

    1.档值为空的时候会报错,处理方式:类似:${(site.wzmc)?default("")}   判断字符串是空的时候的处理情况

    相关资源:使用freemarker生成word文档,源代码 jar包 说明文档及注意事项
    最新回复(0)