Java集成Freemarker根据模板生成Word文档

1. 引入依赖

  <!-- 导出word -->
  <dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.30</version>
  </dependency>

2. 编辑模板

image.png

  • 根据需求编辑模板
  • 使用${}代替需要渲染的值
  • 另存为xml格式

image.png

  • 编辑模板,因为有需要遍历的数据

image.png

<!-- 这里是表格第一行结束位置 -->
<#list dataList as item>
  <!-- 这里是表格第二行的位置 -->
</#list>
  • 更改文件格式为 ftl
  • 在resource目录下增加 templates 目录,并将模板文件上传至该目录

image.png

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);
}

image.png

4.2 查看输出结果

image.png
image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值