FreeMarker生成word的代码

2023-07-12,,



用于生成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的代码的相关教程结束。

《FreeMarker生成word的代码.doc》

下载本文的Word格式文档,以方便收藏与打印。