当前位置: 首页 > news >正文

easyExcel单元格动态合并示例

1.先按照mergekey排序,然后相同的key分组,只保留第一个对象,其他对象属性都设置为null.2.
ClassPathResource resource = new ClassPathResource("template/template.xlsx");
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(resource.getInputStream()).build();
WriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(new PartBoxMergeStrategyNew(16, 27, 11, details.size())).build();FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(header, writeSheet);
excelWriter.fill(details, fillConfig, writeSheet);
excelWriter.finish();

3.public class PartBoxMergeStrategyNew implements CellWriteHandler {// 需要合并的起始列索引(从0开始)private final int startMergeColumns;// 需要合并的结束列索引(从0开始)private final int endMergeColumns;// rowIndex 从0 开始private final int startMergeRowIndex;// rowIndex 从0 开始sprivate final int lastRowIndex;public PartBoxMergeStrategyNew(int startMergeColumns, int endMergeColumns, int startMergeRowIndex, int rowSize) {this.startMergeColumns = startMergeColumns;this.endMergeColumns = endMergeColumns;this.startMergeRowIndex = startMergeRowIndex;this.lastRowIndex = rowSize-1+startMergeRowIndex;}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {// 跳过表头和空值单元格if (isHead) return;Sheet sheet = writeSheetHolder.getSheet();int col = cell.getColumnIndex();int rowIndex = cell.getRowIndex();boolean lastFlag = rowIndex == lastRowIndex;if(rowIndex <= startMergeRowIndex) return;if (col >= startMergeColumns && col <= endMergeColumns) {mergeAdjacentCells(sheet, cell, rowIndex, col, lastFlag);}}//row是从0开始的private void mergeAdjacentCells(Sheet sheet, Cell cell, int currentRowIndex, int currentColIndex, boolean lastFlag) {int firstRow = currentRowIndex;int lastRow = currentRowIndex;// 向上查找合并起始行(跳过空值)// 这里是要等到最后一个空值才进行合并Cell curr = cell.getSheet().getRow(currentRowIndex).getCell(startMergeColumns);while (firstRow -1 >= startMergeRowIndex) {Cell prev = cell.getSheet().getRow(firstRow -1).getCell(startMergeColumns);if(lastFlag) {if(getCellValue(curr)==null&&getCellValue(prev)==null) {//最后一行,当前为空,前一个为空,则继续找,说明还没有找到最前面的一行不为空的,需要继续firstRow--;}else if(getCellValue(curr)==null&&getCellValue(prev)!=null){//最后一行,当前为空,前一个不为空,说明已经找到了需要合并的最前面的一行,同时当前也是空的,所以lastRow不用-1firstRow--;break;}else if(getCellValue(curr)!=null&&getCellValue(prev)!=null){//最后一行,当前不为空,前一个也不为空,相邻的两行都不是空的,无需合并lastRow--;                     break;}else{//最后一行,当前不为空,前一个为空,当前不为空,则说明当前行不是一伙的,所以要-1,前一行为空,说明这一行的领头羊在前面firstRow--;}}else{if(getCellValue(curr)==null) {//不是最后一行,当前为空,则需要等到不为空的行再往上面找,不需要触发合并,break;}else{if(getCellValue(prev)==null){//不是最后一行,当前不为空,前一个为空,则继续找firstRow--;}else{//不是最后一行,当前不为空,前一个不为空,则不用找,当前不为空,说明跟前面不是一伙的,// 前一个不为空,则说明已经找到了最前面的领头的firstRow--;lastRow--;break;}}}}// cur=17 16// 执行合并(如果跨越多行)if (lastRow > firstRow) {sheet.addMergedRegionUnsafe(new CellRangeAddress(firstRow , lastRow , currentColIndex, currentColIndex));}}private Object getCellValue(Cell cell) {switch (cell.getCellType()) {case STRING:return cell.getStringCellValue();case NUMERIC:return cell.getNumericCellValue();case BOOLEAN:return cell.getBooleanCellValue();default:return null;}}}
http://www.dtcms.com/a/578215.html

相关文章:

  • 《嵌入式驱动(十一):I2C子系统架构》
  • Android 多版本Toast版本区别以及使用可能遇到的问题
  • 集团高端网站建设公司wordpress侧边栏文件
  • 【Java面向对象编程入门:接口、继承与多态】
  • 百度联盟的网站怎么做企业网站的设计要求有哪些
  • 别墅花园装修设计公司wordpress 网址优化
  • 云服务器可以做虚拟机吗?
  • 计算机操作系统:文件存储空间的管理
  • 【stm32协议外设篇】- PAJ7620手势识别传感器
  • 网站增加权重吗免费ip地址
  • “工业数据库怎么选”之一:深度解析 PI System vs TDengine
  • 如何做好网站盘锦网站建设策划
  • k8s kubelet Nameserver limits exceeded
  • 供暖季技术实战:益和热力用 TDengine 时序数据库破解热力数据处理难题
  • 蔡甸建设局网站jsp源码做网站
  • AI代码开发宝库系列:Dify本地化部署和应用
  • 推荐高性能MCU微控制器N32H785EC(MCU单片机特征)
  • Bayes/BO-CNN-GRU、CNN-GRU、GRU三模型多变量回归预测Matlab
  • 免费做国际贸易的网站打广告专用图
  • 云南固恒建设集团有限公司网站wordpress主题结合
  • 深度与高程计算:OpenGL RTT技术解析
  • Rust 练习册 10:多线程基础与并发安全
  • 电子商务网站建设评估工具办公宽带多少钱一年
  • Razor VB 变量详解
  • 输入一个故事主题,使用大语言模型生成故事视频【视频中包含大模型生成的图片、故事内容,以及音频和字幕信息】
  • 英文网站首页优化中信建设有限责任公司招投标
  • 前端浏览器设置input不记住密码、不自动填充密码,举例jquery
  • 二级域名免费申请网站环球资源网站网址
  • 网站建设要学多久网站建设与管理 市场分析
  • 潍坊网站建设排行房地产销售人员网站怎么做