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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Freemarker 是一个模板引擎,可以将模板文件与数据合并生成新的文件,因此可以利用 Freemarker 生成 docx 文件。 以下是一个简单的示例: 1. 引入依赖 ```xml <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建模板 创建一个 docx 模板文件,使用 Word 编辑器打开,添加需要动态生成的内容,例如表格、文本等。 3. 编写 Freemarker 模板模板中使用 Freemarker 语法,例如: ```xml <#list users as user> <p>${user.name}</p> <p>${user.age}</p> </#list> ``` 其中 `users` 是数据源,`user` 是遍历的变量。 4. 生成 docx 文件 读取模板文件,合并数据源,生成 docx 文件: ```java public void generateDocx() throws Exception { Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setClassForTemplateLoading(this.getClass(), "/templates/"); cfg.setDefaultEncoding("UTF-8"); Template template = cfg.getTemplate("template.docx"); Map<String, Object> data = new HashMap<>(); List<User> users = new ArrayList<>(); users.add(new User("Tom", 20)); users.add(new User("Jerry", 18)); data.put("users", users); XWPFDocument doc = new XWPFDocument(); OutputStream out = new FileOutputStream("output.docx"); Writer writer = new OutputStreamWriter(out, "UTF-8"); template.process(data, writer); doc.write(out); out.close(); } ``` 其中 `User` 是数据模型,`template.docx` 是模板文件名,`output.docx` 是生成文件名。 运行代码即可生成 docx 文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值