我的需求:

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

  1. 对于常用的工程表格有模板格式,可以任意插拔。
  2. 可以操作任意一个sheet页,进行行列合并,逻辑可以根据业务调整。
  3. 可以对当前存储sheet页数据行进行数据动态插入,单元格操作。
  4. 有实用的输出方式,比如报文实体,字节数组等。
  5. 最后轻量,代码逻辑清晰,好维护。

我是这样做的:

  1. 在构建上基于建造者设计模式
  2. 将excel的构建逻辑抽象,将数据注入逻辑从构建逻辑中分离出来,采用函数式编程的方式。
  3. 实现了样式不同的多sheet页构建。

嗯,时间有限,没有优化代码,小伙伴们有好的想法可以留言。

代码见博客: https://blog.csdn.net/sanhewuyang/article/details/113191009?spm=1001.2014.3001.5501

使用方法:

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<Integer, String> (列索引,数据)
.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实现Excel定制导出(基于POI的工具类)的更多相关文章

  1. java实现Excel数据导出

    java实现Excel数据导出: 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel Jakarta POI 是一套用于访问微软格式文档的Java ...

  2. JAVA实现Excel导入/导出【转】

    JAVA实现Excel导入/导出[转] POI的下载与安装 请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bi ...

  3. Java匹马行天下之JavaSE核心技术——工具类

    Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...

  4. Java并发(十六):并发工具类——Exchanger

    Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...

  5. Java并发(十五):并发工具类——信号量Semaphore

    先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...

  6. Java并发(十四):并发工具类——CountDownLatch

    先做总结: 1.CountDownLatch 是什么? CountDownLatch 允许一个或多个线程等待其他线程(不一定是线程,某个操作)完成之后再执行. CountDownLatch的构造函数接 ...

  7. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  8. Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable

    Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...

  9. java简易excel导入导出工具(封装POI)

    Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...

随机推荐

  1. Codis集群相关

    在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...

  2. python SQLAlchemy反射生成models

    1.安装SQLAcodegen pip install sqlacodegen 2.使用sqlacodegen生成案列 sqlacodegen mysql://root:123456@127.0.0. ...

  3. 转载:从输入 URL 到页面加载完的过程中都发生了什么事情?

    原帖地址:http://www.guokr.com/question/554991/ 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP ...

  4. Excel 多/整列(多/整行)移位操作

    步骤1:创建测试数据 步骤2:把B列和C列进行移位操作(整列移位操作,多列移位操作方法一样) 选中B列,鼠标放到B列边缘地带,直到鼠标显示带有四个箭头方向为止,点击键盘shift键进行拖拽,拖拽时显示 ...

  5. Nuget 安装本地包文件

    Install-Package SomePackage -Source C:\PathToThePackageDir\

  6. flowable中传入审批人是list

    package org.springblade.flow.engine.listener; import org.flowable.engine.delegate.DelegateExecution; ...

  7. 【kinetic】操作系统探索总结(八)键盘控制

    如果尝试过前面的例子,有没有感觉每次让机器人移动还要在终端里输入指令,这也太麻烦了,有没有办法通过键盘来控制机器人的移动呢?答案室当然的了.我研究了其他几个机器人键盘控制的代码,还是有所收获的,最后移 ...

  8. 虚拟机安装Ubuntu 16.04系统实操教程 详尽步骤 vmware ESXi亲测通过

    1 Ubuntu 16.04系统安装要求 Ubuntu 16.04 LTS下载最新版本的Ubuntu,适用于台式机和笔记本电脑. LTS代表长期支持,这意味着有五年免费安全和维护更新的保证. Ubun ...

  9. layer做阻塞式弹出层的方法

    今天遇到一个问题: layer弹出一个confirm提示窗,然后confirm还没有点击对应的按钮的时候,就已经执行了后续代码,我这里做出的判断是,是否需要进行后续操作,但是因为layer.confi ...

  10. 如何快速搭建hadoop集群

    安装好虚拟机,重命名为master 配置网卡 命令:vi /etc/sysconfig/network-scripts/ifcfg-en(按tab键) 这里要配置ip,网关,域名解析 例如我的 IPA ...