用于生成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的代码的更多相关文章

  1. 使用freemarker生成word、html时图片显示问题

    使用freemarker生成word.html时图片显示问题 博客分类: Java 使用freemarker生成word时图片显示问题使用freemarker生成html时图片显示问题使用iText生 ...

  2. Java Web项目中使用Freemarker生成Word文档遇到的问题

    这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...

  3. FreeMarker生成word

    FreeMarker生成word数据填充是通过,Map填充. Map dataMap = new HashMap<String, Object>(); List<User> l ...

  4. freemarker生成word,表格分页

    在做项目的过程中,使用到了freemarker生成word.又有一个需求,明细的要确定有多少页,这就用到了换页的xml标签了,找了我好久 <w:p ><w:r><w:br ...

  5. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...

  6. 使用freemarker生成word,步骤详解并奉上源代码

    1.   步骤 1.    用word编辑好模板 1. 普通字符串替换为 ${string} 2. 表格循环用标签 <#list userList as user> 姓名:${user.u ...

  7. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  8. FreeMarker生成Word文档

    FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...

  9. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

随机推荐

  1. .eslintrc 文件

    安装 建议采用全局安装方式 npm install -g eslint 初始化 如果你的项目还没有配置文件(.eslintrc)的话,可以通过指定–init参数来生成一个新的配置文件: `eslint ...

  2. DS4700电池更换步骤

    DS4700电池更换步骤: 在A控制器里操作(带电热插拔控制器)对逻辑盘进行切换: (需要先将A控下挂的硬盘手工切换到B控上.然后对A控进行电池更换,更换完成后再将原A控下挂硬盘切回) 如下详细步骤: ...

  3. bootstrap的模态框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 设计模式:HelloWorld之策略模式

    一.概述 策略模式 定义了算法族,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式的三要素: 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 具体策略角色: ...

  5. DEV中svg图标的使用

    0.开始之前 先看看使用效果 在操作栏的使用: 在菜单中的使用 1.简述SVG图标 中文名:可缩放矢量图形 外文名:Scalable Vector Graphics 外语缩写:SVG 开发商:万维网联 ...

  6. Python OptionParser 使用详解(转载)

    Python使用命令行参数能使处理流程更自动化. 链接的内容讲解得十分详细:https://www.tuicool.com/articles/rUvIbi

  7. PHP 是什么

    PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本 ...

  8. 2016移动端Android新技术综合预览--好文不多,这一篇就足够

    Csdn /Tamic 原文地址: http://blog.csdn.net/sk719887916/article/details/53525067 本文章6月份已完成(http://www.jia ...

  9. linux和android开发链接

    1.Tracy Mcgrady的专栏冰山一角:linux和Android底层开发,主要是mtk系列点击打开链接 2.郁闷Wednesday:嵌入式linux 单片机 android,点击打开链接 3. ...

  10. 每CPU变量

    最好的同步技术是把设计不需要同步的临界资源放在首位,这是一种思维方法,因为每一种显式的同步原语都有不容忽视的性能开销.最简单也是最重要的同步技术包括把内核变量或数据结构声明为每CPU变量(per-cp ...