【新技能Get】关于自学FreeMarker导出word的那些事

最近,项目中需要做一个导出word文件的功能。

这个,简单!原来在公司就用过一个叫什么什么的软件,网上查找了好久,突然发现是要收费的!!!心如死灰的时候,发现大家都在推荐FreeMarker来做word导出。

找了几篇大神写的文章,对着敲代码,试了一下,发现果真是好用,基本可以实现导出简单字段,动态行的表格什么什么的。

为了巩固一下记忆(看自己的写的习惯一点),决定记录一下学习过程。下面开始上代码,走起!

一、前期准备

1、软件环境:Sublime Text2(替Sublime吹嘘一下,这款文本编辑工具功能真的很强大)、Eclipse

2、需要下载的jar包:freemarker2.3.20.jar  (也可以去官网看看,我是在站内下载的2.3.20版本。官网地址:http://freemarker.org/)

二、懒得起名字了

代码:

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

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;

/**

* <P>Title:关于使用FreeMarker导出Word的测试 </p>

* <P>Description: </p>

* @author

* @date

*/

public class Test {

private Configurationconfiguration = null;

public Test(){

configuration = newConfiguration();

configuration.setDefaultEncoding("UTF-8");

}

public staticvoid main(String[] args) {

Test test = new Test();

test.createWord();

}

public void createWord(){

Map<String,Object>dataMap=new HashMap<String,Object>();

getData(dataMap);

configuration.setClassForTemplateLoading(this.getClass(),"/com");  //FTL文件所存在的位置

Template t=null;

try {

t = configuration.getTemplate("简历模板.ftl");//文件名

} catch (IOExceptione) {

e.printStackTrace();

}

File outFile = newFile("C:/Users/zpx/Desktop/"+Math.random()*10000+".doc");

Writer out = null;

try {

out = new BufferedWriter(newOutputStreamWriter(new FileOutputStream(outFile)));

} catch (FileNotFoundExceptione1) {

e1.printStackTrace();

}

try {

t.process(dataMap,out);

} catch (TemplateExceptione) {

e.printStackTrace();

} catch (IOExceptione) {

e.printStackTrace();

}

}

private void getData(Map<String,Object> dataMap) {

dataMap.put("name","张三");

dataMap.put("birthday","1993-07-27");

dataMap.put("telphone","1123123123");

dataMap.put("sex","女");

dataMap.put("email","sejfis23@154.com");

dataMap.put("img",getImageStr());

//dataMap.put("check_box",""==null?"■":"□");

//Word模板中表格的遍历循环

List<Userlist> list= new ArrayList<Userlist>();

for (int i= 0; i < 10; i++) {

Userlist userlist = new Userlist();

userlist.setEmpolyeeid(i+"");

userlist.setEmpolyeename("内容"+i);

userlist.setLast_update_by("李四");

userlist.setLast_update_date("2016-09-15");

list.add(userlist);

}

dataMap.put("list",list);

}

//对图片进行base64编码

private String getImageStr(){

String imgFile ="E:/Photo圖片/img.jpg";

InputStream in =null;

byte[] data= null;

try {

in = new FileInputStream(imgFile);

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

in.read(data);

in.close();

} catch (IOExceptione) {

e.printStackTrace();

}

BASE64Encoder encoder= new BASE64Encoder();

return encoder.encode(data);

}

}

建一个实体类用户列表循环

public class Userlist {

publicString empolyeeid;

publicString empolyeename;

publicString last_update_by;

publicString last_update_date;

publicString getEmpolyeeid() {

return empolyeeid;

}

publicvoid setEmpolyeeid(String empolyeeid) {

this.empolyeeid = empolyeeid;

}

publicString getEmpolyeename() {

return empolyeename;

}

publicvoid setEmpolyeename(String empolyeename) {

this.empolyeename = empolyeename;

}

publicString getLast_update_by() {

return last_update_by;

}

publicvoid setLast_update_by(String last_update_by) {

this.last_update_by = last_update_by;

}

publicString getLast_update_date() {

returnlast_update_date;

}

publicvoid setLast_update_date(String last_update_date) {

this.last_update_date= last_update_date;

}

}

三、模板的制作

怎么说,就是首先做一个word模板(.doc后缀),然后另存为Word2003 XML文档(.xml),这时候就需要用到上面提到的Sublime Test打开另存为的.xml模板了。

第一次打开开到源码的时候都要疯了。(图1)

用Sublime Text的Indent xml插件,可以把代码格式化。

按照你的需求,把你需要替换的标签替换

(图2)

如姓名后面这块你要导出进数据,这时候就需要你去模板.xml文件中相同位置,添加上${name},然后通过程序里面操作流,替换掉这个${name}标签。

(图3)

到这里,我觉得基本就可以满足一大半的word导出任务了。

然后图片的话,

(图4)

就是红框中的${img}位置本来是有一段好长好长的图片数据流的,用代码中的方法就可以和字段一样替换掉

下面就是重中之重,list列表的导入了。

上面的”模板.xml”文件,这时候需要改变后缀为”模板.ftl”,然后还是用Sublime打开,在需要循环展示的代码段外套加上<#list listas userlist></#list>

,标签中的list是代码中拼装的列表展示数据的集合名称,userlist是实体类的名称,都是可以自定义的。

(图4)

差不多就是这样,欢迎大家指教!

参考资料:http://blog.csdn.net/zhanwentao2/article/details/7255432

http://blog.csdn.net/cheung1021/article/details/6146239

【技能储备】关于自学FreeMarker导出word的那些事相关推荐

  1. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  2. freemarker 导出word文件中包含图片

    最近做的工作中出现的问题记录 在使用freemarker导出word文件的时候,使用wps做模板,出现的情况与网上的情况不同. 在查看网上的例子和资料的时候,模板中的样子是类似于这样的 <w:p ...

  3. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  4. 使用freemarker导出word文档包含多张图片

    使用freemarker导出word文档包含多张图片 最近项目中有个需求就是导出word文档并且文档中需要有多张图片,我当时一脸懵逼啊,之前没有搞过这个啊,但是不要灰心,肯定会有很多人搞过的,百度一下 ...

  5. Java之利用FreeMarker导出Word实例

    开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...

  6. Java使用freemarker导出word试卷

    使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台. Java导出Word的五种方式 制作Word模板 将制作好的Word模板.docx另存为.xml格式,修改xml文件的内 ...

  7. java使用freemarker导出word标题失效问题

    java使用freemarker导出word标题失效问题 如图,导出格式错误切目录不可折叠 另存为xml发现 六级标题变成了其他级别:<w:pStyle w:val="60" ...

  8. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  9. ftl文件模板图片_使用Freemarker导出Word文档(包含图片)代码实现及总结

    本篇是关于利用FreeMarker导出Word的实现步骤. 优点:采用FreeMarker是导出Word的最佳实现,非常的灵活,能够按照自己指定的样式设置并输出内容,操作简单方便,代码实现也容易.代码 ...

最新文章

  1. 执行前端测试的必要性
  2. 近期学习oracle 数据库总结
  3. 关于SQL语言的初步认识
  4. Quartus16.1布线优化选择,重编译可能会满足时序
  5. python 中的爬虫· scrapy框架 重要的组件的介绍
  6. 系统、应用监控的缜密思路,堪称性能瓶颈的克星
  7. 精简JRE第一步 — 精简bin目录
  8. 模块化 组件化 工程化_软件工程中的模块和软件组件
  9. 美团差评数据分析,python代码实现
  10. (转)嵌入式按键驱动,支持短按、长按、双击(中断方式)
  11. 浏览器往返缓存(Back/Forward cache)问题的分析与解决
  12. 有效集法(Active Set),内点法(Interior-Point)及序列二次规划(SQP)法
  13. 于歆杰pdf 电路原理_电路原理于歆杰答案pdf
  14. python实现wgs84坐标系和ECEF坐标系的互换
  15. js Math.rander的用法
  16. 解决win10下 Virtual Box USB功能无法使用问题
  17. 最好的在线Latex编辑器
  18. CrystalDiskInfo 各项参数说明
  19. IDEA全局配置图文教程
  20. java后台icon font 图标替换

热门文章

  1. phpstorm使用教程
  2. 马家河子java,【JAVA】共同的森林
  3. 利用Windows 自带的任务计划功能设置闹钟
  4. 机器学习实战教程(2):K-近邻算法(史诗级干货长文)
  5. 脑网络分析软件丨Hermes 使用
  6. php emoji 保存 显示不出来,PHP导出带有emoji表情的文本到excel文件出问题了
  7. appium java 虫师_利用 IPython 来学习 Appium
  8. unity3d导入xlua
  9. 8核16g服务器能容纳多少人呢?
  10. [Shader]踩脚印