java使用poi-tl模版引擎导出word之列表循环数据渲染

目录

poi-tl模版引擎中,如果区块对的值是一个非空集合,区块中的文档元素会被迭代渲染一次或者N次,这取决于集合的大小,类似于foreach语法。

1.模版制作

在静态资源目录下resources/static/templates新建exportWord.docx,编写以下模版内容:

2.开启spring表达式

(1)引入依赖

xml 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>5.3.18</version>
</dependency>

(2)代码中开启表达式

java 复制代码
ConfigureBuilder builder = Configure.builder();
// 开启spring表达式
builder.useSpringEL();

3.编写关键代码接口

java 复制代码
@GetMapping("/exportWord")
public void exportWord(HttpServletResponse response) throws FileNotFoundException {
    //存放数据,也就是填充在word里面的值
    Map<String, Object> params = new HashMap<>();
    params.put("title","测试使用poi-tl模版导出word");

    List<Map<String, Object>> list = new ArrayList<>();
    Map<String, Object> map = new HashMap<>();
    map.put("a","测试");
    map.put("b","米");
    map.put("c","201312");
    list.add(map);
    Map<String, Object> map1 = new HashMap<>();
    map1.put("a","测试2");
    map1.put("b","千米");
    map1.put("c","2012312");
    list.add(map1);

    params.put("list",list);

    ConfigureBuilder builder = Configure.builder();
    // 开启spring表达式
    builder.useSpringEL();

    // 或模板在静态资源的相对路径
    File rootFile = new File((ResourceUtils.getURL("classpath:").getPath()));
    File templateFile = new File(rootFile, "/static/templates/exportWord.docx");
    //jar包获取不到文件路径`
    //URLDecoder.decode() 解决获取中文名称文件路径乱码
    String templatePath = URLDecoder.decode(templateFile.getPath());
    //生成文件名
    String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_" + System.currentTimeMillis();
    // 导出wold
    try {
        // 导出Word文档为文件
        XWPFTemplate template = XWPFTemplate.compile(templatePath,builder.build()).render(params);
        // 将导出的Word文件转换为流
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition","attachment;filename=\""+fileName+".docx"+"\"");
        // HttpServletResponse response
        OutputStream out = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(bos);
        bos.flush();
        out.flush();
        // 最后不要忘记关闭这些流。
        PoitlIOUtils.closeQuietlyMulti(template, bos, out);
    } catch (Exception e) {
        System.out.println("导出Word文档时出现异常:" + e.getMessage());
    }
}

4. 导出结果

相关推荐
Mr_Xuhhh8 分钟前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法
肖笙XiaoSheng10 分钟前
使用Gemini2.5 pro 优化我的定时任务(二)
java·后端·代码规范
小小霸王龙!12 分钟前
互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用
java·spring boot·redis·微服务·电商
旺旺大力包13 分钟前
【JS笔记】JS 和 noodjs 的常见操作(十)
开发语言·javascript·node.js·ecmascript
深栈解码14 分钟前
JUC并发编程 CAS运行机制详解
java·后端
草履虫建模15 分钟前
Postman - API 调试与开发工具 - 标准使用流程
java·测试工具·spring·json·测试用例·postman·集成学习
深栈解码15 分钟前
JUC并发编程 ThreadLocal解析
java·后端
衍生星球22 分钟前
Maven 3.9.6的下载和配置
java·maven·springboot
缘来是庄29 分钟前
设计模式之代理模式
java·设计模式·代理模式
都叫我大帅哥36 分钟前
向量数据库Milvus:非结构化数据的救星,AI开发者的瑞士军刀
java·python