Java实现freemarker生成word模板

        博主在做的是将word源文件中的内容读取出来,然后按照固定的格式输出,当然,源文件有大量,所以编写了程序来批量自动生成目标文件。

        本文要介绍的就是如何生成模板,并将从源文件截取的内容填充到模板文件(即生成目标文件)的过程,读取源文件内容的方法请阅读博主另一篇文章《Java实现poi方式读取word文件内容》。

1.准备工作

        jar包----------freemarker.jar,网上都可以下载,找不到的朋友可以联系我。

        word模板文件,博主准备的模板如下图:

2.制作模板

2.1在需要自动填充文字的位置,做变量标记(${变量名},如${name})。

博主测试所做的标记如下图,为省事年月日就不填了,举例即可。

2.2将文档以xml格式保存,word另存为,有保存为xml格式的,我就不截图了。

2.3将刚才的xml扩展名更改为ftl,比如“test.xml”更改为“test.ftl”。

2.4用编辑器打开.ftl文件,博主用的是Dreamweaver,打开里面乱七八糟一堆。。此时不要急,百度搜索“xml文件格式化”,利用在线工具即可,选中.ftl中所有内容,将内容格式化后,再复制到编辑器新建的文件中,注意原来的文件不要关闭,格式化内容只是为了方便检查内容是否有错误。

    那么我们要检查什么呢?看下图:


我们在模板文件中编辑的变量名称,被错误地分开了,这种情况下,将源文件(就是乱七八糟一堆的那个文件)里面,我上图中标蓝的部分删除,让变量名称正常,检查完所有的变量名称无误后保存文件,模板文件到此就制作完成了。

3.将内容填充到模板中

3.1.Map集合

public Map<String, String> StringtoMap(String buffer){
		
		Map<String,String> dataMap = new HashMap<>();
		dataMap.put("shName", "新一");
		dataMap.put("class", "二(3)");
		dataMap.put("group", "3");
		dataMap.put("name", "王小二");
		return dataMap;
	    
	}
请务必保证集合中的key键与模板中设置的变量名称一致,如shName与${shName}中的名称一致。

3.2.源代码

package com.freemarker.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;

public class testFreemarker {

	
private Configuration configure = null;
	
	public testFreemarker(){
		
		configure = new Configuration();
		configure.setDefaultEncoding("utf-8");
	}
	
	/** 
     * 根据Doc模板生成word文件 
     * @param dataMap Map 需要填入模板的数据 
     * @param fileName 模板文件名称 如test.ftl
     * @param savePath 保存路径 
     */  
    public void createDoc(Map<String, String> dataMap, String fileName, String savePath){  
           try{  
                  //加载需要装填的模板  
                  Template template  = null;  
                  //加载模板文件  
                  configure.setClassForTemplateLoading(this.getClass(),"/"); //将模板文件直接复制到src目录下
                 // configure.setDirectoryForTemplateLoading(new File("D:\\"));//模板文件在本地硬盘d
                  //设置对象包装器  
                  configure.setObjectWrapper(new DefaultObjectWrapper());  
                  //设置异常处理器  
                  configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);  
                  //定义Template对象,注意模板类型名字与downloadType要一致  
                  template= configure.getTemplate(fileName);  //文件名调用的时候可更换
                  //输出文档  
                  File outFile = new File(savePath);  
                  Writer out = null;  
                  out= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));    
                  template.process(dataMap,out);  
                  //outFile.delete();  
                  if(out != null){
                	  out.close();
                  }
           }catch (Exception e) {  
                  e.printStackTrace();  
           }  
    }  
	
	public Map<String, String> StringtoMap(){
		
		Map<String,String> dataMap = new HashMap<>();
		dataMap.put("shName", "新一");
		dataMap.put("class", "二(3)");
		dataMap.put("group", "3");
		dataMap.put("name", "王小二");
		return dataMap;
	    
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Map<String,String> dataMap = new HashMap<>();
		testFreemarker tf = new testFreemarker();
		dataMap = tf.StringtoMap();
		tf.createDoc(dataMap, "test.ftl", "D:\\Object.doc");
	}

}
3.3打开D盘根目录下的Object.doc,效果如下:

至此,生成目标文件完成。如果想要下划线长度不变并且自动在下划线上填充内容的话,将下划线用制表符的方式生成就可以了。

本文属于原创内容,资源来源于网络,如有雷同,情有可原,博主很诚实。如果帮了你的忙,请给博主点个赞,觉得废柴,留言提意见,谢谢大家阅读。博主联系方式在“写给读者的话”分类中,欢迎联系,共同进步。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值