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来进行展示的。