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

本文介绍使用Java和FreeMarker库导出Word文档的方法。通过XML模板和动态数据结合,可以轻松生成带有循环数据的Word文件。适用于简历生成等场景。

对于这个功能,想必也有其他平台会需要吧。比如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>中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

除不掉的灰色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值