Java怎样实现将数据导出为Word文档

文章首发于我的博客:Java怎样实现将数据导出为Word文档 - Liu Zijian's Blog

我们在开发一些系统的时候,例如OA系统,经常能遇到将审批单数据导出为word和excel文档的需求,导出为excel是比较简单的,因为excel有单元格来供我们定位数据位置,但是word文档的格式不像表格那样可以轻松的定位,要想将数据导出为一些带有图片和表格的这种结构复杂的word文档该怎样实现呢。

poi-tl [1]是一款可以帮助我们实现这种功能的Java开源项目,它把POI和Freemarker相结合,可以基于我们绘制好的word文档模板来填充数据进去,然后生成新的word文档。poi-tl托管在GitHub:https://github.com/Sayi/poi-tl

例如,我们要生成一个差旅行程单,首先要绘制这样的一个word文档模板,用{{name}}代表姓名进行占位,姓名就是普通文字类型,以此类推。tripList作为渲染行程表格的数据源的名字,是ArrayList集合类型,放在表格的表头,用[from]表示tripList集合中每个元素的from属性的值,渲染到当前行的某一列上,以此类推。最后的三个签署对应的是领导的签名笔迹图片,图片类型要用变量名前多一个@的形式{{@****Pin}}来表示

如果表格中某一列是图片,则表示为[@变量]

image

模板绘制好以后,开始使用poi-tl工具生成word文档,首先新建maven项目,引入poi-tl的依赖和需要的其他依赖,然后将这个绘制好的word模板文件放在工程的根目录

```xml


    4.0.0

    org.example
    poi-tl
    1.0-SNAPSHOT

    
        8
        8
        UTF-8
    

    
        
            com.deepoove
            poi-tl
            1.12.2
        

        
            org.projectlombok
            lombok
            1.18.24
            provided
        
    


```

然后,新建一个Entity类: org.example.TravelApplyExportVO

```java
package org.example;

import com.deepoove.poi.data.PictureRenderData;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TravelApplyExportVO {
    private String no;
    private String name;
    private String dept;
    private String employeeNo;
    private String start;
    private String end;
    private String days;
    private String address;
    private String reason;
    /**
     * com.deepoove.poi.data.PictureRenderData 代表图片
     */
    private PictureRenderData applyPin;
    private PictureRenderData bossPin;
    private PictureRenderData leaderPin;

    private String date;

    /**
     * 用于渲染表格的集合
     */
    private List tripList = new ArrayList<>();

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Route {
        private String from;
        private String to;
        private String flight;
        private String depTime;
        private String arrTime;
        private String cabin;
    }
}
```

新建测试类: org.example.Main,用poi-tl组件基于刚刚绘制的word模板生成一个差旅行程单

```java
package org.example;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import lombok.SneakyThrows;


import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;

public class Main {

    @SneakyThrows
    public static void main(String[] args) {

        TravelApplyExportVO vo = new TravelApplyExportVO();
        vo.setNo("202500001");
        vo.setName("lzj");
        vo.setDept("技术部");
        vo.setEmployeeNo("00000001");
        vo.setStart("2025-01-01");
        vo.setEnd("2025-02-01");
        vo.setDays("30");
        vo.setAddress("中国香港");
        vo.setReason("系统维护");

        // 在项目根路径读取笔迹图片,并设置大小
        PictureRenderData data1 = Pictures.ofBytes(Files.readAllBytes(Paths.get("img2.png")))
                .size(120, 60)
                .create();

        PictureRenderData data2 = Pictures.ofBytes(Files.readAllBytes(Paths.get("img.png")))
                .size(120, 60)
                .create();

        PictureRenderData data3 = Pictures.ofBytes(Files.readAllBytes(Paths.get("img.png")))
                .size(120, 60)
                .create();

        vo.setApplyPin(data1 );
        vo.setBossPin( data2);
        vo.setLeaderPin( data3);

        vo.setDate("2025-01-10");

        // 行程List,最终渲染到文档的表格中
        vo.setTripList(new ArrayList() {
            {
                add(new TravelApplyExportVO.Route("BJX","ZQZ","ZH5643","2025-01-01 15:00","2025-01-01 16:00","E"));
                add(new TravelApplyExportVO.Route("ZQZ","CDE","JUH6532","2026-01-01 15:00","2025-12-01 16:00","A"));
                add(new TravelApplyExportVO.Route("BJX","ZQZ","KJU0954","2027-01-01 15:00","2025-05-01 16:00","Q"));
            }
        });

        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();

        // !!将tripList通过表格来渲染
        Configure config = Configure.builder()
                .bind("tripList", policy)
                .build();

        XWPFTemplate template = XWPFTemplate
                .compile("模板.docx", config)
                .render(vo);

        template.writeAndClose(Files.newOutputStream(Paths.get("output.docx")));
    }
}
```

然后领导签名笔记图片素材img.png,img2.png也需要放进工程根目录下

都完成后,执行main()方法测试,程序运行结束后,将在根路径生成文件output.docx,打开就是我们想要的效果了。

image

文章写到这已经是深夜了,最新在开发一个OA系统,需要Word导出的场景很多,由于之前没怎么接触过,于是熬夜攻关了一下并记录了下来,接下来希望项目能顺利交付吧~

参考


  1. https://deepoove.com/poi-tl/ ↩︎

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6042.html

(0)
LomuLomu
上一篇 2025 年 1 月 12 日 下午4:19
下一篇 2025 年 1 月 12 日 下午5:19

相关推荐

  • JavaScript 拖拽与观察者模式的实现及应用

    前言 本文将通过几个具体的代码片段,深入探讨 JavaScript 中的拖拽功能和观察者模式(发布-订阅模式)的实现及其应用场景。 这些代码片段不仅展示了如何实现这些功能,还解释了其背后的原理和实际用途。通过阅读本文,读者可以更好地理解 JavaScript 的高级特性,并将其应用到实际项目中。 1. 拖拽功能的实现 代码片段 “`html Documen…

    2025 年 1 月 19 日
    47600
  • JavaCV 图像边缘检测 之 Canny 算法

    # 博主简介 我是**CSDN博客专家**,同时也是**历代文学网**的总架构师,拥有超过**15年**的行业经验。我精通**Java编程**,擅长**高并发系统设计**,对**Springboot和微服务架构**有深入的理解和实践经验。此外,我还熟悉**Linux操作系统**、**ESXI虚拟化技术**,以及**云原生技术栈Docker和Kubernete…

    未分类 2024 年 12 月 27 日
    43600
  • SpringBoot高级-底层原理

    “`markdown 目录 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 02-SpringBoot2高级-自动化配置初体验 03-SpringBoot2高级-底层原理-@Configuration配置注解 04-SpringBoot2高级-底层原理-@Import注解使用1 05-SpringBoo…

    2024 年 12 月 27 日
    33300
  • 【初阶数据结构与算法】八大排序之非递归系列( 快排(使用栈或队列实现)、归并排序)

    * 文章目录 一、非递归版快排 1.使用栈实现非递归版快排 2.使用队列实现非递归版快排 二、非递归版归并排序 1.非递归版归并排序的实现 一、非递归版快排 1.使用栈实现非递归版快排 在学习非递归版快排前,建议大家先学习递归版的快排,否则非递归版的快排将很难理解,这里附上本人写的快排的博客解析:【初阶数据结构与算法】八大排序算法之交换排序(冒泡排序,快速排…

    2025 年 1 月 11 日
    27000
  • 数据库与编程语言的连接

    — title: 数据库与编程语言的连接 date: 2024/12/21 updated: 2024/12/21 author: cmdragon excerpt: 数据库与编程语言的连接是实现数据驱动应用程序的核心步骤。开发者通过运用多样的编程语言和数据库驱动程序,可以在应用中执行数据库的CRUD(创建、读取、更新、删除)操作。 categories…

    未分类 2024 年 12 月 24 日
    43400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信