对于这个功能,想必也有其他平台会需要吧。比如51job导出文档形式的简历这样。我在这里讲的是用java代码能满足我们实现这一功能的好用的一些方法。废话不多说了。
这种导出word,用XML的方式实现,相对简单。 word2003版本以后的都可以保存xml的形式。
模板:
保存成xml文件,用Notepad++打开编辑,并将这些需要添加的字段值用${ } 包着。这样才满足xml文件获取对应key键。
如果一张表想for循环得到多条数据,则需要在对应位置添加 <#list newList as listKey>
然后把这样xml文件另存为.ftl文件,导入.ftl模板文件到指定目录。加载jar包freemarker.jar下载
代码如下:
public class WordUtil {
private Configuration configuration = null;
public WordUtil(){
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
}
public void createWord(){
Map<String,Object> dataMap=new HashMap<String,Object>();
getData(dataMap);
configuration.setClassForTemplateLoading(WordUtil.class, "/com/jinsuicloud/api/util");//模板文件所在路径
Template t=null;
try {
// System.err.println("路径:"+WordTest.class.getClassLoader().getResource("/").toURI());
t = configuration.getTemplate("test03.ftl"); //获取模板文件
} catch (IOException e) {
e.printStackTrace();
}
File outFile = new File("E:/"+Math.random()*10000+".doc"); //导出文件
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void getData(Map<String, Object> dataMap) {
dataMap.put("title", "自动化操作系统");
dataMap.put("year", "2017");
dataMap.put("month", "11");
dataMap.put("day", "8");
dataMap.put("oneName", "黎明");
List<Map<String,Object>> newList = new ArrayList<Map<String,Object>>();
for (int i = 0; i < 10; i++) {
Map<String,Object> listKey = new LinkedHashMap<String,Object>();
listKey.put("id", i);
listKey.put("name", "李明"+i);
listKey.put("age", "age"+i);
listKey.put("love", "love"+i);
newList.add(listKey);
}
System.err.println("12222==="+newList);
dataMap.put("newList", newList);
}
public static void main(String[] args) {
WordUtil test = new WordUtil();
Map<String,Object> dataMap=new HashMap<String,Object>();
test.createWord();
// test.getData(dataMap);
}
}
注意:1. ftl文件里的<#list newList as listKey>中的newList要和代码里的
dataMap.put("newList", newList)key键一致。
2.如果ftl文件报错,关于某个字段错了什么的。可以在前面加
<#if myOptionalVar??>${listKey.id} <#else></#if> 这段代码意思是,如果id不为null,就进来,否则就进<#else>中。
本文介绍使用Java和FreeMarker库导出Word文档的方法。通过XML模板和动态数据结合,可以轻松生成带有循环数据的Word文件。适用于简历生成等场景。

1925

被折叠的 条评论
为什么被折叠?



