FreeMarker之生成复杂word(包含图片) (二)

     上1篇博客中讲FreeMarker做了简单的介绍,这篇博客就来使用它来完成两个例子。

      在项目中使用它完成的功能是依照固定的模板将数据导出到Word。比如台账。在完成后将处理进程依照台账的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变。

     这个功能就是由XML+Freemarder来实现的,Word从2003开始支持XML格式,大致的步骤:用office2003或以上的版本编辑好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。

      上1篇博客中提到,使用Freemarker其实就只准备模板和数据。下面的步骤其实概括起来就两步:第1步是制作模板,第2步是准备数据.

具体实现进程如 下:

1、  制作模板

     首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,将需要动态填充的内容使用Freemarker标签替换:Word文档样式以下:

        

 

将Word文档另存为XML格式,将后缀名“xml”修改成“ftl”,模板制作完成

图片处理:

    我们可以看到上面的模板中有图片,当我们将xml修改成ftl以后打开文件可以看到原来图片的位置全部都是乱码。这是由于ftl不能够辨认图片,我们只要将这些乱码用${image}替换掉既可以了。

        

循环处理:

模板中明细表中的数据是1个集合,我们需要循环遍历才能够将数据全部注入,这个时候我们就会用到了FreeMarker本身的语法了。

循环:

<#list array as bean>

  ${bean.property}

</#list>

     代码放在表格的开头和结尾,也即是将表格中的标签包括在循环里面,这模样就能够了。

在制作模板的进程中遇到的1个问题:${xxx}这些标记在ftl中被拆成1个1个的,让我很无语。最后我还是手动的将这些又重新拼到1起了。

2. 准备数据,将上面模板中的${}的标签放上对应的数据

首先要讲freemarker的jar包放到程序中,然后将上面制作好的模板放到程序中;

           

最后加上下面的代码就能够了

 

package com.ftl;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;

public class DocumentHandler {

private Configuration configuration = null;

public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf⑻");
}

public void createDoc() {
// 要填入模本的数据文件
Map dataMap = new HashMap();
getData(dataMap);
// getTest(dataMap);
// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
// 这里我们的模板是放在com.template包下面
configuration.setClassForTemplateLoading(this.getClass(),
"/com/template");
Template t = null;
try {
// test.ftl为要装载的模板
t = configuration.getTemplate("temple.ftl");
t.setEncoding("utf⑻");

} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称
File outFile = new File("D:/test.doc");
Writer out = null;

try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf⑻"));
} catch (Exception e1) {
e1.printStackTrace();
}

try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 注意dataMap里寄存的数据Key值要与模板中的参数相对应
* @param dataMap
*
*/
@SuppressWarnings("unchecked")
private void getData(Map dataMap) {
dataMap.put("image", getImageStr());
dataMap.put("name", "张3");

List<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>();
for(int i=1;i<=5;i++){
Map<String, Object> map=new HashMap<String, Object>();
map.put("purchaseTime", "进货日期"+i);
map.put("product", "产品名称"+i);
map.put("factory", "生产厂家"+i);
map.put("spec", "产品规格"+i));
map.put("number", "进货数量"+i);
newsList.add(map);
}
dataMap.put("newsList",newsList);
}
private String getImageStr() {
String imgFile = "d:/1.png";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}

}

package com.ftl;

public class main {
/**
* @param args
*/
public static void main(String[] args) {
DocumentHandler dh=new DocumentHandler();
dh.createDoc();
System.out.println("end");
}

}

3. 生成的结果展现

4. 总结

       这个工具生成word确切很方便,但是通过这两天查找资料也发现这个工具也是有很多不足的地方的,毕竟不是甚么都是10全10美的。在网上找到1个帖子简单的总结了1下这个工具的3个不好的地方,下面是连接地址有肯定的可以去看看。http://www.iteye.com/topic/17468

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » FreeMarker之生成复杂word(包含图片) (二)

44 评论

  1. order sildenafil without prescription nolvadex usa robaxin drug

  2. tadalis 10mg sale tadalafil drug cost voltaren 100mg

  3. buy generic modafinil 100mg Cialis women brand diamox 250 mg

  4. buy generic naltrexone 50 mg femara brand buy abilify

  5. nootropil pills cheap viagra sildenafil 100mg england

  6. order sildenafil 100mg for sale order viagra sale lisinopril 5mg drug

  7. buy zyvox 600mg online cheap poker online game online casinos for real money

  8. writing a paper essays writing online gambling for real money

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡