Java实现将数据导出为Word文档的方法步骤
作者:lzj2014
我们在开发一些系统的时候,例如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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!