天天看点

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>();

   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);

   // 这个地方不能使用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;

   in = new fileinputstream(filename);

   data = new byte[in.available()];

   in.read(data);

   in.close();

  } 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.filenotfoundexception;

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

 * @date 2015-4-12 上午9:36:43

@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;

   // 调用工具类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);

   if (fin != null)

    fin.close();

   if (out != null)

    out.close();

   if (file != null)

    file.delete(); // 删除临时文件

service代码

package com.ucap.netcheck.service;

/**  

 * @title: report2wordservice.java

 * @package com.ucap.netcheck.service

 * @description: 用户生成word的报告的service接口

 * @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.list;

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.isinglerejectresultservice;

import com.ucap.netcheck.service.isiteservice;

import com.ucap.netcheck.service.targettypeservice;

 * @title: report2wordserviceimpl.java

 * @package com.ucap.netcheck.service.impl

 * @description:

 * @author 

 * @date 2015-4-12 上午11:58:09

@service

public class report2wordserviceimpl implements ireport2wordservice {

    private isiteservice siteservice;

 private checkserviceservice checkserviceservice;

 private ireport2worddao report2worddao;

 private targettypeservice targettypeservice;

 private isinglerejectresultservice singlerejectresultservice;

  * todo

 @override

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