freemarker制作word模板
程序员文章站
2022-03-08 12:16:39
...
1.调用free marker导出word
@Test
public void testExportWord() {
EnergyVo vo = new EnergyVo(); // 为ftl中所用的属性集合对象
File file = null;
String fileName = "test.ftl";
try {
file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "ftl/"+fileName);
// file = new File()getClass().getClassLoader().getResource("lic").getFile();
// ResourceFinder.getResourceAsStream("");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
DocumentHandler documentHandler = new DocumentHandler();
//保存路径
String savePath = file.getParent()+"\\test4.doc";
System.out.println("保存路径:"+savePath);
setAllData(vo);
// setImage(file, vo);
documentHandler.createDoc(file.getParent(), file.getName(), savePath, vo);
System.out.println("ok");
}
1.将test.doc文件另存为test.xml格式的文件。
2.更改test.xml为test.ftl。文中的路径需要自己更改。
3.EnergyVo 为ftl中所用的属性的集合对象,如 属性 String head,在test.ftl中可${head}拿到值。
2.导出word模板
/**
*
* @param dir 模板加载路径
* @param tempName 模板名称
* @param savePath 文件保存的路径、文件名
* @param sDate 数据集
*/
public void createDoc(String dir, String tempName, String savePath, Object sDate) {
Template template = null;
// 文件保存位置
File outFile = new File(savePath);
Writer out = null;
try {
// 设置模板加载路径
configuration.setDirectoryForTemplateLoading(new File(dir));
// 异常控制
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
// 加载模板
template = configuration.getTemplate(tempName);
//生成文件的路径及文件名
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
out =bufferedWriter;
// 合并模板和数据
template.process(sDate, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3.test.ftl文件解析
1.表格模板的制作
java类vo中建立属性
@ApiModelProperty(value = "表1-1")
private List<Map<String, Object>> listTab1_1;
test类中赋值
List<Map<String, Object>> listTab1_1 = new ArrayList<>();
for (int i = 0; i < 4; i++) {
Map<String, Object> map = new HashMap<>();
map.put("sort", "_");
map.put("name", "_");
map.put("trans", "_");
map.put("sale", "_");
listTab1_1.add(map);
}
vo.setListTab1_1(listTab1_1);
ftl文件中映射取值
注意:属性命名时首字母不能大写。中间不能有特殊符号,如- +,可以为_。
<w:tr>为表格的行,w:t为一个单元格。<w:t>处为单元格的值,<w:tcw >为单元格长度
2. 遇到空单元格。需要合并单元格如何做
可在要遍历此单元格的属性前添加空值判断
注意:边框问题:常见边框标签
<w:tcBorders>
<w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/>
</w:tcBorders>
可通过这种方法添加边框
方法2.在<w:tcW w:w="1506" w:type="dxa"/>下面可添加此标签
<w:vMerge w:val="restart"/>为有值单元格所有的标签
<w:vMerge/>为空值单元格的标签
3.如何插入图片
根据<v:imagedata r:id="rId8" o:title="1521623111(1)"/> 此处的id值搜索。找到target属性值media/image2.png。搜索此值。找到一段64位编码的符号。在<pkg:binaryData>中。删除这些符号。使用vo中的属性值代替
<pkg:part pkg:name="/word/media/image2.png" pkg:contentType="image/png" pkg:compression="store">
<pkg:binaryData> ${image4_1} </pkg:binaryData>
</pkg:part>
String imagepath = file.getParent() + "/image4_1.png";// 图片的路径
private static String getImageStr(String imagepath) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imagepath);
data = new byte[in.available()];
in.read(data);
in.close();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
} catch (IOException e) {
System.out.println(e.getMessage());
}
return null;
}
将经过此方法的返回值赋值给vo类中的属性
vo.setImage4_1(getImageStr(imagepath));
到此。图片就可以在模板中显示
以上内容为初次使用freemaker的心得,以后遇到更多问题会持续更新。
上一篇: 仿nice打标签
下一篇: 云计算与devops
推荐阅读