Java实现将数据导出为Word文档的方法步骤
我们在开发一些系统的时候,例如OA系统,经常能遇到将审批单数据导出为word和excel文档的需求,导出为excel是比较简单的,因为excel有单元格来供我们定位数据位置,但是word文档的格式不像表格那样可以轻松的定位,要想将数据导出为一些带有图片和表格的这种结构复杂的word文档该怎样实现呢。
poi-tl 1是一款可以帮助我们实现这种功能的Java开源项目,它把POI和Freemarker相结合,可以基于我们绘制好的word文档模板来填充数据进去,然后生成新的word文档。
例如,我们要生成一个差旅行程单,首先要绘制这样的一个word文档模板,用{{name}}代表姓名进行占位,姓名就是普通文字类型,以此类推。tripList作为渲染行程表格的数据源的名字,是ArrayList集合类型,放在表格的表头,用[from]表示tripList集合中每个元素的from属性的值,渲染到当前行的某一列上,以此类推。最后的三个签署对应的是领导的签名笔迹图片,图片类型要用变量名前多一个@的形式{{@****Pin}}来表示
如果表格中某一列是图片,则表示为
[@变量]

模板绘制好以后,开始使用poi-tl工具生成word文档,首先新建maven项目,引入poi-tl的依赖和需要的其他依赖,然后将这个绘制好的word模板文件放在工程的根目录下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>poi-tl</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
然后,新建一个Entity类: org.example.TravelApplyExportVO
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<Route> 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模板生成一个差旅行程单
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<TravelApplyExportVO.Route>() {
{
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,打开就是我们想要的效果了。

到此这篇关于Java实现将数据导出为Word文档的方法步骤的文章就介绍到这了,更多相关Java数据导出为Word内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring框架JavaMailSender发送邮件工具类详解
这篇文章主要为大家详细介绍了Spring框架JavaMailSender发送邮件工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-04-04
基于 SASL/SCRAM 让 Kafka 实现动态授权认证的方法
在大数据处理和分析中 Apache Kafka 已经成为了一个核心组件,本文将从零开始部署 ZooKeeper 和 Kafka 并通过配置 SASL/SCRAM 和 ACL(访问控制列表)来增强 Kafka 的安全性,需要的朋友可以参考下2024-07-07
SpringBoot整合Spring Security过滤器链加载执行流程源码分析(最新推荐)
Spring Boot 对于 Spring Security 提供了自动化配置方案,可以使用更少的配置来使用 Spring Security,这篇文章主要介绍了SpringBoot整合Spring Security过滤器链加载执行流程源码分析,需要的朋友可以参考下2023-02-02
MyBatis中的collection两种使用方法及效率比较
collection主要是应对表关系是一对多的情况,本文主要介绍了MyBatis中的collection两种使用方法及效率比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-06-06


最新评论