通過Freemarker的模板生成相關的文件(生成docx)

1、首先創建一個docx文件,將這個文件另存爲xml文件類型

2、通過editplus等純文本文件打開工具,打開相關的文件,將需要相關的值設置爲變量,即freemarker的變量設置;如${test};

3、將文件名改爲ftl文件的後綴

4、開始搭建freemarker框架;代碼如下:

引入freemarker

		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.29</version>
		</dependency>

編寫相關的測試代碼:

package com.qlys.frame.word;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.ui.freemarker.SpringTemplateLoader;

import freemarker.cache.FileTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
import sun.misc.BASE64Encoder;

public class ReadFreemarkerTemplate {

	
	private ResourceLoader load = new DefaultResourceLoader();
	//Freemarker配置對旬
	private static final Configuration cfg = new Configuration(Configuration.getVersion());
	//FREEMARKER模板路徑
	private static final String LOAD_PATH = "classpath:/com/qlys/frame/word";
	private static final String ENCODING = "UTF-8";
	
	
	private TemplateLoader createTemplateLoader() {
		Resource path = load.getResource(LOAD_PATH);
		try {
			return new FileTemplateLoader(path.getFile());
		} catch (Exception e) {
			return new SpringTemplateLoader(load,LOAD_PATH);
		}
		
	}
	
	public void createFile(Map<String,Object> data,OutputStreamWriter write) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
		cfg.setTemplateLoader(createTemplateLoader());
		cfg.setDefaultEncoding(ENCODING);
		Template temp = cfg.getTemplate("test.ftl");
		temp.process(data, write);
		write.flush();
	}
	
	public static void main(String[] args) {
		HashMap<String, Object> map = new HashMap<>();
		map.put("a", "a");
		map.put("b", "ab");
		map.put("c", "ac");
		
		try(FileWriter w = new FileWriter("d:/show.docx")) {
			map.put("test", getImageBase("C:/Users/lenovo/Pictures/2737b15e1a594866885109e31e15b4e4.jpg"));
			new ReadFreemarkerTemplate().createFile(map, w);	
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	} 
	
	
	public static String getImageBase(String src) throws Exception {
		File file = new File(src);
		if (!file.exists()) {
			return "";
		}
		InputStream in = null;
		byte[] data = null;

		try {
			in = new FileInputStream(file);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(data);
	}
}

在這個類中 getImageBase用於將圖片文件轉爲base64字符串,因此在word中的圖片是通過base64來進行展示的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章