实践总结-freemarker生成word模板

一、项目需求描述:

根据获取的计算模型计算的结果生成一个word模型固定的word报告。

计算结果结构如下:


数据结构

原始word模板如下:


原始word模板

预期输出结果如下:


预期结果1


预期结果2


预期结果3

代码实现思路:

通过word xml生成flt模板文件此处注意word版本,此次实践涉及的word xml标签及freemarker标签详见上篇《word xml + freemarker生成模板文件》

通过freemarker相关jar包中提供的方法,封装一个freemarker模板处理类(代码下面贴出);

使用模板处理类接收HashMap类型的数据,key值对应在flt文件中使用的占位符的名称;

将数据来源进行一系列业务处理,进行分类、统计,最后用HashMap对其进行包装,产生freemarker模板中所需的所有变量的值的HashMap;


代码实现:

1、freemarker模板类

```

importfreemarker.template.Configuration;

importfreemarker.template.Template;

importfreemarker.template.TemplateException;

importjava.io.*;

importjava.util.HashMap;

importjava.util.Map;

public classDocumentHandler {

privateConfigurationconfiguration=null;

privateStringencoding="utf-8";

privateStringtemplatePath;

privateStringtemplateName;

privateMapdataMap;

privateStringsaveFileDir="";

privateStringfileName;

privateStringreturnFileFullPath;

publicDocumentHandler() {

configuration=newConfiguration();

}

public voidcreateDoc(String saveFileDir,String fileName,String encoding,String templatePath,String templateName,Map datasource) {

InitParas(saveFileDir,fileName,encoding,templatePath,templateName,

datasource);

this.createDoc();

}

private voidInitParas(String saveFileDir,String fileName,

String encoding,String templatePath,String templateName,

Map datasource) {

this.saveFileDir= saveFileDir;

this.fileName= fileName;

this.encoding= encoding;

this.templatePath= templatePath;

this.templateName= templateName;

this.dataMap= datasource;

configuration.setDefaultEncoding(this.encoding);

//设置模本装置方法和路径FreeMarker支持多种模板装载方法。可以从servlet,classpath,数据库装载

//这里我们的模板是放在dist.dgp.template包下

configuration.setClassForTemplateLoading(this.getClass(), this.templatePath);

}

public voidcreateDoc() {

configuration.setDefaultEncoding(this.encoding);

//设置模本装置方法和路径FreeMarker支持多种模板装载方法。可以从servlet,classpath,数据库装载

//这里我们的模板是放在com.havenliu.document.template包下

configuration.setClassForTemplateLoading(this.getClass(), this.templatePath);

//要填入模版的数据文件

if(null==dataMap){

System.out.println("警告,模板数据源为空。");

dataMap=newHashMap();

}

try{

//装载的模板名称

Template t =configuration.getTemplate(this.templateName);

//输出文档路径

File outDir =newFile(this.saveFileDir);

if(!outDir.exists()){

outDir.mkdirs();

}

File outFile =newFile(outDir.getAbsolutePath()+"/"+this.fileName);

Writer out =null;

//此编码必须得跟模板的编码是一致的,否则打开生成的word,提示xml非法字符

out =newBufferedWriter(newOutputStreamWriter(newFileOutputStream(outFile),this.encoding));

t.process(dataMap,out);

if(outFile.exists()){

this.returnFileFullPath= outFile.getAbsolutePath();

System.out.println(returnFileFullPath);

}else{

this.returnFileFullPath="";

}

}catch(IOException e) {

e.printStackTrace();

}catch(TemplateException e) {

e.printStackTrace();

}

}

getter、setter...

}

```

2、业务处理后使用HashMap进行包装

```

//模板内值对应实体

//用地统计-管理单元总量分析计算结果

dataMap.put("totalManagementList",totalManagementList);

//用地统计-编制单元总量分析计算结果

dataMap.put("compilationList",compilationList);

//公服配置-管理单元-子类型计算结果

dataMap.put("managementUnitPSMap",manageUnitPSSubMap);

//公服配置-编制单元-子类型计算结果

dataMap.put("compilationUnitPSMap",compilationUnitPSSubMap);

```

3.在flt模板文件中使用freemarker标签,进行文件内容填充


flt模板文件内容形式--管理单元总量分析计算结果



flt模板文件内容形式--编制单元总量分析计算结果


flt模板文件内容形式--编制单元公服配置子类型


flt模板文件内容形式--编制单元公服配置子类型中的计算结果

管理单元公服配置与编制单元公服配置形式相同。

4.模板生成方法:

```

private  DocumentHandler  doc;

doc.setDataMap(dataMap);//数据源

doc.setTemplateName(this.templateName);

doc.setSaveFileDir(SystemUtil.getProjectPhysicalPath() +fileSaveDir);//生成文件保存路径

doc.setFileName(newIPTimeStamp().getIPTimeStampRandom() +"."

+this.fileExtension);

doc.createDoc();//生成文档

```

生成成功后就可以在指定的路径下去查看文件了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容