如何用 JAVA 实现一个基于 POI 的复杂表格导出工具类?

网友投稿 778 2022-05-29

我的需求:

项目中有一些工程表格需要导出,设计到行列合并,定制样式,原有工具类冗余,内聚性强。所以想写一个可以随意定制excel的工具类,工具类满足需求:

对于常用的工程表格有模板格式,可以任意插拔。

可以操作任意一个sheet页,进行行列合并,逻辑可以根据业务调整。

可以对当前存储sheet页数据行进行数据动态插入,单元格操作。

有实用的输出方式,比如报文实体,字节数组等。

最后轻量,代码逻辑清晰,好维护。

我是这样做的:

在构建上基于建造者设计模式

将excel的构建逻辑抽象,将数据注入逻辑从构建逻辑中分离出来,采用函数式编程的方式。

实现了样式不同的多sheet页构建。

在代码上结合原有工具类数据转化部分优点,利用JSON格式实现数据处理

嗯,时间有限,没有优化代码,小伙伴们有好的IDEA可以留言。可以基于这个扩展操作方法

使用方法:

public static void main(String[] args) { // 使用方法 new WorkbookUtil() // 文件名称 .setFileName(null) // TODO 初始化一个excel .initWorkbook() // TODO 初始化一个sheet页,可自定义逻辑,(HSSFWorkbook,String) ->{ HSSFSheet} .initSheet(null,null) // TODO 初始化sheet页表头 ,可自定义逻辑,(HSSFSheet,HeadDetails) ->{ HSSFSheet} 下同 .initSheetHead(null,null,null,null) // 填充sheet页数据 .setSheetData(null,null,null) // sheet页数据指定列合并行 .setDataRowMerged(null,null,null) // sheet页数据指定相邻列合并,可以传入多值,(单行合并,值相同情况) .setDataCellMerged(null,null,null) // 当前sheet当前行插入数据 data :Map (列索引,数据) .setSheetRow(null,null) // 当前sheet当前行强制合并 (firstCol,lastCol) 合并索引[必填] .setRowMerged(null,null) // 当前sheet指定行强制合并 .setCellRangeAddress(null,null) // 初始化表尾 .initSheetFoot(null,null) // TODO 第二个sheet页.. .initSheet(null,null) .initSheetHead(null,null,null,null) .setSheetData(null,null,null) .initSheetFoot(null,null) .setDataRowAndCellMerged(null,null,null) //.... // .builderByte() 输出字节数组 // 直接写入报文 .builderResponseEntity(); }

具体的Demo:

如何用 JAVA 实现一个基于 POI 的复杂表格导出工具类?

基本的表格

简单的行列合并:

稍微复杂的行列合并:

代码

package com.hhwy.pwps.util.excel; import java.util.LinkedList; import java.util.List; /** * @author Liruilong * @Date 2021-01-20 15:37 * @Description: */ public class HeadDetails { private List headDetails = new LinkedList<>(); public static class HeadDetail{ private String key; private String title; private int width = 50; //列数据单元格是否对齐 private boolean center = true; public String getKey() { return key; } public HeadDetail setKey(String key) { this.key = key; return this; } public String getTitle() { return title; } public HeadDetail setTitle(String title) { this.title = title; return this; } public int getWidth() { return width; } public HeadDetail setWidth(int width) { this.width = width; return this; } public boolean isCenter() { return center; } public HeadDetail setCenter(boolean center) { this.center = center; return this; } } public HeadDetails add(String key,String title,int width){ this.headDetails.add(new HeadDetail().setTitle(title).setKey(key).setWidth(width)); return this; } public HeadDetails add(String key,String title,int width,boolean center){ this.headDetails.add(new HeadDetail().setTitle(title).setKey(key).setWidth(width).setCenter(center)); return this; } public HeadDetails add(String key,String title){ this.headDetails.add(new HeadDetail().setTitle(title).setKey(key)); return this; } public List builder(){ return this.headDetails; } public int headSize(){ return this.headDetails.size(); } }

Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Vuex状态机快速了解与应用
下一篇:【APICloud系列|21】使用APICloud敏捷式开发总结,回顾开发一个完整APP过程。
相关文章