工作中遇到需要根据模板内容生成word文档需求,特此记录。
一、准备word并转化成xml文件
1、准备word模板
2、使用office打开,并另存为 Word Xml文档格式。
3、将生成好的XML文件用工具打开,并格式化,我使用的是Notepad++,并安装了XML Tools插件。
刚生成好的xml文件如下:
此时,格式不利于代码编写,需要格式化,格式化完成后如下,
此时,我们可直接将XML文件后缀名改为.doc并打开,发现没有问题,如部分文字位置不对,一般是文档中的空格在转成xml时自动去除了。此时我们可将XML文件调整下。
如“页眉”两字直接在图片后面了,中间没有了空格,此时,我们在xml文件中搜索“页眉”,找到如下代码:
<w:t xml:space="preserve"/>这个<w:t>标签中,添加了xml:space="preserve"属性,xml:space是一个Enumerated类型的属性,它的设置值只能是“default”或“preserve”:“default”表示应用程序可以自行随意处理空格等字符;“preserve”则表示应用程序应把空格等字符当做普通文本字符处理。所以我们可将<w:t>页眉</w:t>修改为<w:t xml:space="preserve"> 页眉</w:t>,再保存后转为.doc文档,查看,页眉显示和原来一样了。
至此,前期工作已准备好了。我们开始在项目中实现导出。
二、在项目中相应目录中添加一个ftl文件,将处理后的xml代码拷贝到文件中。
将xml文件中需要替换的内容写上freemarker标签,如将姓名修改为代码传参。将xml中“张妍”替换为 ${name!''}
三、编写测试代码:
package com.near.demo.word.service;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class ExportWordService {
private static final Logger logger = LoggerFactory.getLogger(ExportWordService.class);
public static void main(String[] args) throws Exception {
String outputFile = "C:\\Users\\Administrator\\Desktop\\word\\test.doc";
OutputStream out = new FileOutputStream(outputFile);
Map<String, Object> map = new HashMap<>();
map.put("name", "李四");
createWord(out, "/wordTemplate.ftl", map);
}
public static void createWord(OutputStream out, String templatePath, Object props) {
Writer wrter = null;
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
// 模板加载路径
configuration.setClassForTemplateLoading(ExportWordService.class, "/template");
Template t = null;
try {
t = configuration.getTemplate(templatePath);
wrter = new OutputStreamWriter(out, "utf-8");
t.process(props, wrter);
wrter.flush();
} catch (Exception ex) {
logger.error(ex.getMessage());
} finally {
if (null != wrter) {
try {
wrter.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
}
}
运行后,成功生成word文档。姓名也修改为了李四。后期再加上一些问题解决记录。