基于freemarker在本地生成word(.doc)文档,只看这一篇就够了

先说下大概的步骤

1、先用word文档编辑一个你想生成文件的模板,如图


2、编辑好之后,把该word文档另存为xml文件,如图


3、把生成的xml文件放入你的项目指定的文件夹下,这个路径一会会用到,可放在src目录或webRoot目录下

4、打开xml文件,此时会发现生成的xml文件格式不美观,可百度xml文件格式化进行格式化

5、格式化之后,对test.xml进行重命名,改成test.ftl,用过freemarker的应该会比较熟悉了,之前模板的${name}刚好就用到了

6、在test.ftl中找到进行base64编码后的图片的字符串换成${imageStr},一会能用到


7、下面就可以正式写代码了

工具类:testUtil.java,如下

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

/** 
 * @ClassName   Test.java
 * @Author      lina
 * @Describtion 测试类
 * @Date        创建时间:2017-7-13 上午9:48:50 
 *
 */
public class TestUtil {
	
	public Configuration configure = null;
	private static Logger logger = LoggerFactory.getLogger(TestUtil.class);
	
	public TestUtil () {
		configure = new Configuration();
        configure.setDefaultEncoding("utf-8");
	}
	
	/**
     * 根据Doc模板生成word文件
     * @param dataMap 需要填入模板的数据
     * @param downloadType 文件名称
     * @param savePath 保存路径
     */
	public void createDoc (Map<String,Object> dataMap,String downloadType,String savePath, 
    		HttpServletRequest request, HttpServletResponse response) {
        try {
            // 加载需要装填的模板
            Template template = null;
            /**
             * Freemarker提供了3种加载模板目录的方法
             * 1、通过文件系统加载  --void setDirectoryForTemplateLoading(File dir);
             * 2、通过类的地址 ------void setClassForTemplateLoading(Class cl, String prefix);
             * 3、通过Servlet ------void setServletContextForTemplateLoading(Object servletContext, String path);
             */
            String path =  request.getRealPath("/") + "/WEB-INF/template/admin";
            configure.setDirectoryForTemplateLoading(new File(path));
//            configure.setClassForTemplateLoading(this.getClass(), "/com/pankebao/entity");
            // 设置对象包装器
//            configure.setObjectWrapper(new DefaultObjectWrapper());
            // 设置异常处理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            // 定义Template对象,注意模板类型名字与downloadType要一致
            template = configure.getTemplate(downloadType+".ftl");
            File outFile = new File(savePath);
            Writer out = null;
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
            template.process(dataMap, out);
            out.close();
        } catch (IOException e) {
        	logger.warn("====异常信息====" + e);
            e.printStackTrace();
        } catch (TemplateException e) {
        	logger.warn("====异常信息====" + e);
            e.printStackTrace();
        }
    }
	
	/**
     * 磁盘图片加密
     * 如:D:/test.jpg
     */
    public static String getDirImageStr(String imgFile) {
    	InputStream in = null;
    	byte[] data = null;
    	try {
    		in = new FileInputStream(imgFile);
    		data = new byte[in.available()];
    		in.read(data);
    		in.close();
    	} catch (FileNotFoundException e) {
    		logger.warn("====异常信息====" + e);
    		e.printStackTrace();
    	} catch (IOException e) {
    		logger.warn("====异常信息====" + e);
    		e.printStackTrace();
    	}
    	BASE64Encoder encoder = new BASE64Encoder();
    	return encoder.encode(data);
    }
	
	public static class Info {
		
		private String name;
		private String mobile;
		private String address;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getMobile() {
			return mobile;
		}
		public void setMobile(String mobile) {
			this.mobile = mobile;
		}
		public String getAddress() {
			return address;
		}
		public void setAddress(String address) {
			this.address = address;
		}
	}
	

}


8、下面我们需要写个测试类或接口

a.测试类,在testUtil中请使用通过类文件加载freemarker文件,以上已注释


b.接口,毕竟把ftl文件放在src目录下不合适,通过接口测试


9、写完测试接口后,在ftl文件中找到<w:tr></w:tr>,此处用list数组进行遍历,如图,再把${name}改成${list.name},电话和住址一样要改


10、写了这么多,终于可以测试了









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个猴子请来的救兵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值