自定义word模板生成(记录第一次使用)

feemarker基于word模板的导出方式, 这种方式非常简单而且导出的样式美观, 其原理就是先做一个word模板, 该模板中变量数据用 x x x 这 种 方 式 填 写 , 然 后 再 导 出 时 只 需 读 取 模 板 然 后 用 相 应 的 数 据 替 换 其 中 的 {xxx}这种方式填写, 然后再导出时只需读取模板然后用相应的数据替换其中的 xxx,{xxx}

例:模板
在这里插入图片描述
将word另存为xml
将xml扩展名改为ftl
打开ftl文件, 搜索w:binData 或者 png可以快速定位图片的位置,图片 已经编码成0-Z的字符串了,
将上述0-Z的字符串全部删掉,写上${imgStr}(变量名随便写)后保存
liet数据存放
搜索 w:tr 可以找到行的起点与结束点(注意第一对w:tr 是表头,应找第二对 w:tr), 如图:
在这里插入图片描述
用<#list userList as user> </#list>标签将第二对 w:tr 标签包围起来(userList是集合的key, user是集合中的每个元素, 类似<c:forEach items=‘userList’ var=‘user’>), 如图
在这里插入图片描述

java代码:
/**
* 根据传值生成word文件 生成pdf 生成jpg
* @param yundan
* @param shijian
* @param path
* @return
/
public Map<String, Object> getCreatFTLMap(YundanVO yundan,String shijian,String path){
Map<String, Object> dataMap=new HashMap<String, Object>();
dataMap.put(“deptId”, yundan.getDeptId());
dataMap.put(“danhao”, yundan.getDanhao());
dataMap.put(“shijian”, shijian);
dataMap.put(“tuoyunfang”, (yundan.getTuoyunfang() == null) ? “” : yundan.getTuoyunfang());
dataMap.put(“shouhuofang”, (yundan.getShouhuofang() == null) ? “” :yundan.getShouhuofang());
dataMap.put(“tuoyunfangdianhua”, (yundan.getTuoyunfangdianhua() == null) ? “” :yundan.getTuoyunfangdianhua());
dataMap.put(“shouhuofangdianhua”, (yundan.getShouhuofangdianhua() == null) ? “” :yundan.getShouhuofangdianhua());
dataMap.put(“zhuanghuodidian”, (yundan.getZhuanghuodianhua() == null) ? “” :yundan.getZhuanghuodianhua());
dataMap.put(“yunshumudidi”, (yundan.getYunshumudidi() == null) ? “” :yundan.getYunshumudidi());
dataMap.put(“zhuanghuoren”, (yundan.getZhuanghuoren() == null) ? “” :yundan.getZhuanghuoren());
dataMap.put(“zhuanghuodianhua”, (yundan.getZhuanghuodianhua() == null) ? “” :yundan.getZhuanghuodianhua());
dataMap.put(“zhuanghuoriqi”, (yundan.getZhuanghuoriqi() == null) ? “” :yundan.getZhuanghuoriqi());
dataMap.put(“yudingdaodariqi”, (yundan.getYudingdaodariqi() == null) ? “” :yundan.getYudingdaodariqi());
dataMap.put(“chengyunfang”, (yundan.getChengyunfang() == null) ? “” :yundan.getChengyunfang());
dataMap.put(“jingyingxukezheng”, (yundan.getJingyingxukezheng() == null) ? “” :yundan.getJingyingxukezheng());
dataMap.put(“chengyundianhua”, (yundan.getChengyundianhua() == null) ? “” :yundan.getChengyundianhua());
dataMap.put(“cheliangpaizhao”, (yundan.getCheliangpaizhao() == null) ? “” :yundan.getCheliangpaizhao());
dataMap.put(“guachepaizhao”, (yundan.getGuachepaizhao() == null) ? “” :yundan.getGuachepaizhao());
dataMap.put(“cheliangyunshuzheng”, (yundan.getCheliangyunshuzheng() == null) ? “” :yundan.getCheliangyunshuzheng());
dataMap.put(“guacheyunshuzheng”, (yundan.getGuacheyunshuzheng() == null) ? “” :yundan.getGuacheyunshuzheng());
dataMap.put(“jiashiyuan”,(yundan.getJiashiyuan() == null) ? “” : yundan.getJiashiyuan());
dataMap.put(“yayunyuan”, (yundan.getYayunyuan() == null) ? “” :yundan.getYayunyuan());
dataMap.put(“jiashiyuanzigezheng”,(yundan.getJiashiyuanzigezheng() == null) ? “” :yundan.getJiashiyuanzigezheng());
dataMap.put(“yayunyuanzigezheng”,(yundan.getYayunyuanzigezheng() == null) ? “” : yundan.getYayunyuanzigezheng());
dataMap.put(“jiashiyuandianhua”,(yundan.getJiashiyuandianhua() == null) ? “” : yundan.getJiashiyuandianhua());
dataMap.put(“yayunyuandianhua”, (yundan.getYayunyuandianhua() == null) ? “” :yundan.getYayunyuandianhua());
dataMap.put(“imgStr”, getImageStr(path));
List list = new ArrayList();
for(int i=0;i<yundan.getHuowu().size();i++){
Huowu huowu1 = new Huowu();
huowu1.setLianheguobianhao(“123456”);
huowu1.setHuowumingcheng(“石油”);
huowu1.setLei(“2类”);
huowu1.setBaozhuangguige(“B类包装”);
huowu1.setShuliang(“1”);
list.add(huowu1);
}
dataMap.put(“huowuList”, list);
return dataMap;
}
/
*
* 根据数据生成word文件
* @param dataMap
* @param path
* @return
/
public String creatWordByFTL(Map<String, Object> dataMap,String path) {
try {
//Configuration 用于读取ftl文件
Configuration configuration = new Configuration(new Version(“2.3.28”));
configuration.setDefaultEncoding(“utf-8”);
/
*
* 以下是两种指定ftl文件所在目录路径的方式,注意这两种方式都是
* 指定ftl文件所在目录的路径,而不是ftl文件的路径
*/
//指定路径的第二种方式,我的路径是C:/a.ftl
configuration.setDirectoryForTemplateLoading(new File(“D:/”));
//输出文档路径及名称
File outFile = new File(path);
//以utf-8的编码读取ftl文件
Template template = configuration.getTemplate(“yundan.ftl”, “utf-8”);
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), “utf-8”), 10240);
template.process(dataMap, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return path;
}
二维码生成代码:
public String getImageStr(String path){
String fileName= null;
try {
fileName = QRCodeUtils.encode(“http://202.100.168.52:27028/favicon.ico”, “”, path, true);
} catch (Exception e) {
e.printStackTrace();
}
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(path+"/"+fileName);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值