在生信工作中,我们经常会需要自动化出word报告,推荐使用java的freemaker模块处理。
首先需要自己在word内做出模板,并将需要填充的内容更改为${name}这样的格式,例如:
然后将docx文件另存为xml文件,用记事本打开查看更改的内容是否正常。
pom管理的在pom.xml中添加依赖模块,或者直接下载对应的jar包加入到环境
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
添加生成docx文件的代码
import freemarker.template.Template;
import freemarker.template.Configuration;
import java.io.*;
import java.util.Map;
public class WriteDocx {
private Configuration loadConfigue (String template) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDefaultEncoding("UTF-8");
try {
File templatePath = new File(template);
cfg.setClassForTemplateLoading(WriteDocx.class, templatePath.getParent());
} catch (Exception e) {
e.printStackTrace();
}
return cfg;
}
public void writeTemplate (String template, String outpath, Map<String, String> hashmap) {
Configuration cfg = loadConfigue(template);
try {
File f_o = new File(outpath);
BufferedWriter fileOutputStream = new BufferedWriter (new OutputStreamWriter (new FileOutputStream(f_o),"UTF-8"));
Template temp = cfg.getTemplate((new File(template)).getName());
temp.process(hashmap, new BufferedWriter(fileOutputStream));
} catch (Exception e) {
e.printStackTrace();
}
}
}
添加main函数
import java.io.IOException;
import java.util.HashMap;
public class PDF2Docx {
public static void main(String[] args) throws IOException {
HashMap HASHMAP = new HashMap<>();
HASHMAP.put("name", "咩咩");
HASHMAP.put("sex", "male");
HASHMAP.put("age", "99");
final String outPath = args[0];
String template = "templates/template.xml";
WriteDocx writeDocx = new WriteDocx();
writeDocx.writeTemplate(template, outPath, HASHMAP);
}
}
如果需要动态填充列表,就将HashMap写入到ArrayList即可,并在xml添加列表循环。