用于生成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. iphone inline video fragments

    DOMContentLoaded 它在DOM加载之后及资源加载之前被触发 通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览 ...

  2. Java线程池使用和常用参数

    多线程问题: 1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源. 2.java中简单的实现多线程的方式 ...

  3. Python小代码_9_求水仙花数

    for i in range(100, 1000): ge = i % 10 shi = i // 10 % 10 bai = i // 100 if ge ** 3 + shi ** 3 + bai ...

  4. 如何改变hr颜色

    html中用css改变颜色,<hr style="border:0;background-color:#ff0000;height:1px;">如果不加border:0 ...

  5. 纯CSS菜单样式,及其Shadow DOM,Json接口 实现

    先声明,要看懂这篇博客要求你具备少量基础CSS知识, 当然如果你只是要用的话就随便了,不用了解任何知识 完整项目github链接:https://github.com/git-Code-Shelf/M ...

  6. python笔记十(列表生成式、字典生成式、生成器、生成器的并行)

    一.列表生成式 列表生成式就是python设置的可以用来可以生成列表的. 如要生成一个0-9的列表我们可以通过以下代码实现: >>> list(range(10)) [0, 1, 2 ...

  7. 安卓高级 WebView的使用到 js交互

    我们先来学习 怎么使用再到用js和安卓源生方法交互 WebView简单使用 此部分转载并做了补充 原博客 原因:比较简单不是很想在写,我只要写js交互部分 WebView可以使得网页轻松的内嵌到app ...

  8. Hive基本原理及环境搭建

    今天我主要是在折腾这个Hive,早上看了一下书,最开始有点凌乱,后面慢慢地发现,hive其实挺简单的,以我的理解就是和数据库有关的东西,那这样的话对我来说就容易多啦,因为我对sql语法应该是比较熟悉了 ...

  9. Swift中如何化简标准库中冗长的类实例初始化代码

    可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效. 我们实际写一个例子看一下: import UIKit class CFoo{ static let share ...

  10. python模块:网络协议和支持

    python模块:网络协议和支持 webbrowser 调用浏览器显示html文件 webbrowser.open('map.html') [webbrowser - Convenient Web-b ...