FreeMarker生成word的代码



用于生成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("")}   判断字符串是空的时候的处理情况

时间: 2024-09-29 07:20:25

FreeMarker生成word的代码的相关文章

使用freemarker生成word带图片,图片显示不正常

问题描述 使用freemarker生成word带图片,图片显示不正常 使用freemarker导出word带图片,本地测试可以,放到服务器上就会出现有的图片显示不正常,是有的图片,是什么原因啊,求指点,图片是base64处理 解决方案 图片损坏了,检查下是传输不完整还是有异常发生 解决方案二: 应该是网络的问题 没有完整的上传 解决方案三: 应该是网络的问题 没有完整的上传

freemarker-关于FreeMarker生成word时,list标签遍历问题

问题描述 关于FreeMarker生成word时,list标签遍历问题 各位大大好,我是昨天刚接触freemarker.在学习中遇到了一个问题,还请各位大大帮帮忙...感激不尽 解决方案 你仿佛在逗我.这个母鸡啊.友情帮顶

用 Freemarker 生成 word 文档

 阅读目录 添加图片 自定义载入模板 1.       用word写一个需要导出的word模板,然后存为xml格式. 2.       将xml中需要动态修改内容的地方,换成freemarker的标识符,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <w:p wsp:rsidR="00D02906" wsp:rsidRDefault="00FA4C58" wsp:rsidP="00FA4C58"

java-使用freemarker生成的word文档,如何转成标准格式的word?

问题描述 使用freemarker生成的word文档,如何转成标准格式的word? 使用freemarker生成的word文档,如何转成标准格式的word? freemarker生成的word转成PDF后,图片丢失. 所以想到将freemarker生成的xml格式的word转成标准格式的word在转成PDF. 现在不知道怎么将xml格式的word转成标准格式的word. 求帮忙啊! 解决方案 文件已经解决.不适用freemarker生成word了..用poi替换关键字,继续使用原生的word.

通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

 通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名改成ftl文件(要注意的是生成xml格式要是2003格式的xml,也就是说拿到的word模板得是2003格式的,否则用wps打开word将会出现问题)   详细步骤如下: 模板制作(将要动态显示的数据打上标记,这个标记是freemarker中的EL标记,要注意的是,要控制值为空的情况,下面${(si

C#生成Word文档代码示例

  这篇文章主要介绍了C#生成Word文档代码示例,本文直接给出代码实例,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

通过复制Table生成word和excel的javascript代码

 通过复制Table生成word和excel,个人感觉这个功能还是比较实用的,下面有个不错的示例,希望对大家有所帮助 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/19

freemarker生成的word,在手机上打不开

问题描述 freemarker生成的word,在手机上打不开 最近客户转战手机端办公,问题来了,电脑上能打开的word,到了手机上就打不开了.freemarker生成的word的文件类型是Microsoft Office Word 97 - 2003 文档的. 自己创建的word在手机上是可以打开的.问题出在哪? 解决方案 文件加密了吧,要不就是版本太低了 解决方案二: word打不开怎么办Word打不开,如何修复word文档?Word文档打不开怎么办

文档-如何使用freemarker完成word目录的动态生成?

问题描述 如何使用freemarker完成word目录的动态生成? 目前已经使用freemarker生成的带格式的word文档,但是目前对于word目录的页码生成尚存在问题,使用jacob来导出的话一直包未将dll文件放入正确的目录下面. 解决方案 看看这个吧,写的很详细,太多了不给你粘了http://zhixinghh-163-com.iteye.com/blog/1914785 希望对你有帮助