1. 引入依赖
<!-- 导出word -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2. 编辑模板
- 根据需求编辑模板
- 使用${}代替需要渲染的值
- 另存为xml格式
- 编辑模板,因为有需要遍历的数据
<!-- 这里是表格第一行结束位置 -->
<#list dataList as item>
<!-- 这里是表格第二行的位置 -->
</#list>
- 更改文件格式为 ftl
- 在resource目录下增加 templates 目录,并将模板文件上传至该目录
3. 代码
3.1 常量
package mawenda.cn.constant;
/**
* @author Ma.wenda
* @version 1.0.0
* @date 2023/2/20 12:08
*/
public class UserWordConstant {
/**
* 默认记录人
*/
public static final String DEFAULT_NOTE_TAKER = "张三";
/**
* 文档变量名:记录人
*/
public static final String NOTE_TAKER = "noteTaker";
/**
* 文档变量名:列表数据
*/
public static final String LIST_NAME = "dataList";
}
3.2 实体类
package mawenda.cn.entity;
import lombok.Data;
import java.io.Serializable;
/**
* @author Ma.wenda
* @version 1.0.0
* @date 2023/2/16 18:27
*/
@Data
public class User implements Serializable {
/**
* 用户ID
* */
private Long id;
/**
* 姓名
* */
private String name;
/**
* 性别
* */
private String sex;
/**
* 身份证号
* */
private String idCard;
/**
* 住址
* */
private String address;
/**
* 备注
* */
private String remarks;
}
3.3 服务类
package mawenda.cn.service;
import mawenda.cn.entity.User;
import java.util.List;
/**
* @author Ma.wenda
* @version 1.0.0
* @date 2023/2/20 12:41
*/
public interface UserService {
/**
* 获取用户列表
* @return List<User>
*/
List<User> queryAllUser();
}
package mawenda.cn.service.impl;
import mawenda.cn.entity.User;
import mawenda.cn.service.UserService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author Ma.wenda
* @version 1.0.0
* @date 2023/2/20 12:41
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public List<User> queryAllUser() {
List<User> users = new ArrayList<>();
for (int i = 1; i <= 9; i++) {
User user = new User();
user.setId((long) i);
user.setIdCard("11000019980101000"+i);
user.setName("User"+i);
user.setSex(i % 2 == 0 ? "男" : "女");
user.setAddress("北京市朝阳区"+i+"号楼");
user.setRemarks("优秀员工");
users.add(user);
}
return users;
}
}
3.4 工具类
package mawenda.cn.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.*;
import java.util.Map;
/**
* @author Ma.wenda
* @version 1.0.0
* @date 2023/2/16 18:29
*/
public class FreeMarkUtil {
/**
* 获取freemarker配置
* @return Configuration
*/
private static Configuration newConfiguration(){
Configuration configuration = new Configuration(Configuration.VERSION_2_3_30);
configuration.setDefaultEncoding("UTF-8");
configuration.setClassForTemplateLoading(FreeMarkUtil.class, "/templates");
return configuration;
}
/**
* 数据写入
* @param templateName 模板名称
* @param outPath 文件输出路径
* @param dataMap 待写入数据
*/
public static void writerWord(String templateName, String outPath, Map<String,Object> dataMap) throws IOException, TemplateException {
Template template = newConfiguration().getTemplate(templateName);
template.process(dataMap, new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPath))));
}
}
4.测试
4.1 集成测试
@Test
void contextLoads() throws TemplateException, IOException {
// 声明输出目录
String outFilePath = "/data/tmp/";
// 声明输出文档名称
String fileName = outFilePath+UUID.randomUUID()+".docx";
// 创建待写入的数据集合
Map<String, Object> dataMap = new HashMap<>();
// 写入记录人
dataMap.put(UserWordConstant.NOTE_TAKER,UserWordConstant.DEFAULT_NOTE_TAKER);
// 写入用户数据
dataMap.put(UserWordConstant.LIST_NAME,userService.queryAllUser());
// 将数据写入模板
FreeMarkUtil.writerWord("人员信息登记表.ftl", fileName, dataMap);
System.out.println("文件输出至:" + fileName);
}
4.2 查看输出结果