用于生成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包 说明文档及注意事项