使用freemarker模板导出word文档

最近项目中要使用到导出word这项功能,参考了许多导出的方法,发现使用freemarker模板导出word的效果最好可以保持原样。

导入freemarker的架包

1.首先我们需要用word制作一份模板,打开word编辑我们想要的word样式。

如图:

2.在需要填写的地方用变量来代替。如果有图片需要先用图片来填充。然后另存为xml文件,然后再把后缀名改为.ftl的格式

3.处理ftl文件,把图片替换成变量。

4.word表格的填充,ftl也要做修改。找到自己表格所在的那行,word中<w:tr>表示一行,我们找到表头的下一行。

从这行开始修改studengList表示待会代码要放进去的List <w:tr>,缩起来了

5.java代码

package com.smxy.lq.utils;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder;
/**
 * 
 * @Description :使用freemark模板生成word文档
 * @author Bush罗
 * @date 2018年8月20日
 *
 */
public class WordFreemark {

	private Configuration configuration = null;

	public WordFreemark() {
		configuration = new Configuration();
		configuration.setDefaultEncoding("UTF-8");
	}

	public static void main(String[] args) {
		WordFreemark test = new WordFreemark();
		test.createWord();
	}

	public void createWord() {
		Map<String, Object> dataMap = new HashMap<String, Object>();
		getData(dataMap);
		configuration.setDefaultEncoding("utf-8");//设置编码
		configuration.setClassicCompatible(true);
		configuration.setClassForTemplateLoading(
				this.getClass(),
				"/ftl/word");// FTL文件所存在的位置
		Template t = null;
		try {
			t = configuration.getTemplate("word.ftl"); // ftl模板名称
		} catch (IOException e) {
			e.printStackTrace();
		}
		File outFile = new File("D:/word" + 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("name", "Bush罗");
		dataMap.put("number", "2015089879");
		//填充图片
		dataMap.put("image", getImageStr());
		//表格填充
		List<Student> studentList=new ArrayList<Student>();;
		for(int i=0;i<10;i++){
			Student student=new Student();
			student.setName("小明");
			student.setPhone("1234567");
			student.setSex("男");
			studentList.add(student);
		}
		dataMap.put("studentList", studentList);

	}
	//图片转码
    public String getImageStr() {  
        String imgFile = "E:/AAA.png";  
        InputStream in = null;  
        byte[] data = null;  
        try {  
            in = new FileInputStream(imgFile);  
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data);  
    }  
}

6.生成样式

猜你喜欢

转载自blog.csdn.net/BushQiang/article/details/81813747