Java模板动态⽣成word⽂件的⽅法步骤
最近项⽬中需要根据模板⽣成word⽂档,模板⽂件也是word⽂档。当时思考⼀下想⽤POI API来做,但是觉得⽤起来相对复杂。后来⼜了⼀种⽅式,使⽤freemarker模板⽣成word⽂件,经过尝试觉得还是相对简单易⾏的。
使⽤freemarker模板⽣成word⽂档主要有这么⼏个步骤
1、创建word模板:因为我项⽬中⽤到的模板本⾝是word,所以我就直接编辑word⽂档转成freemarker(.ftl)格式的。
2、将改word⽂件另存为xml格式,注意使⽤另存为,不是直接修改扩展名。
3、将xml⽂件的扩展名改为ftl
4、编写java代码完成导出
使⽤到的jar:freemarker.jar (2.3.28) ,其中Configuration对象不推荐直接new Configuration(),仔细看Configuration.class⽂件会发现,推荐的是 Configuration(Version incompatibleImprovements) 这个构造⽅法,具体这个构造⽅法⾥⾯传的就是Version版本类,⽽且版本号不能低于2.3.0
闲⾔碎语不再讲,直接上代码
public static void exportDoc() {
String picturePath = "D:/image.png";
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("brand", "海尔");
dataMap.put("store_name", "海尔天津");
dataMap.put("user_name", "⼩明");
//经过编码后的图⽚路径
String image = getWatermarkImage(picturePath);
dataMap.put("image", image);
java创建文件//Configuration⽤于读取ftl⽂件
Configuration configuration = new Configuration(new Version("2.3.0"));
configuration.setDefaultEncoding("utf-8");
Writer out = null;
try {
//输出⽂档路径及名称
File outFile = new File("D:/导出优惠证明.doc");
out = new BufferedWriter(new OutputStreamWriter(new
FileOutputStream(new File("outFile")), "utf-8"), 10240);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 加载⽂档模板
Template template = null;
try {
//指定路径,例如C:/a.ftl 注意:此处指定ftl⽂件所在⽬录的路径,⽽不是ftl⽂件的路径
configuration.setDirectoryForTemplateLoading(new File("C:/"));
//以utf-8的编码格式读取⽂件
template = Template("导出优惠证明.ftl", "utf-8");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("⽂件模板加载失败!", e);
}
// 填充数据
try {
template.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
throw new RuntimeException("模板数据填充异常!", e);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("模板数据填充异常!", e);
} finally {
if (null != out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("⽂件输出流关闭异常!", e);
}
}
}
}
因为很多时候我们根据模板⽣成⽂件需要添加⽔印,也就是插⼊图⽚
/***
* 处理图⽚
* @param watermarkPath 图⽚路径 D:/image.png
* @return
*/
private String getWatermarkImage(String watermarkPath) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(watermarkPath);
data = new byte[in.available()];
in.close();
} catch (Exception e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
de(data);
}
注意点:
插⼊图⽚后的word转化为ftl模板⽂件(ps:⽔印图⽚可以在word上调整到⾃⼰想要的⼤⼩,然后在执⾏下⾯的步骤)
1、先另存为xml
2、将xml扩展名改为ftl
3、打开ftl⽂件, 搜索w:binData 或者 png可以快速定位图⽚的位置,图⽚已经编码成0-Z的字符串了, 如下:
5、将上述0-Z的字符串全部删掉,写上${image}(变量名随便写,跟dataMap⾥的key保持⼀致)后保存
6、也是创建⼀个Map, 将数据存到map中,只不过我们要把图⽚⽤代码进⾏编码,将其也编成0-Z的字符串,代码请看上边
⾄此⼀个简单的按照模板⽣成word并插⼊图⽚(⽔印)功能基本完成。
到此这篇关于Java模板动态⽣成word⽂件的⽅法步骤的⽂章就介绍到这了,更多相关Java 模板动态⽣成word内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论