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