天天看點

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("")}   判斷字元串是空的時候的處理情況