您的位置:首页 > 编程语言 > Java开发

JAVA 数据导出Word文档模板的功能实现

2017-11-09 10:13 555 查看
对于这个功能,想必也有其他平台会需要吧。比如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>中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: