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

【学习总结】EasyExcel合并同列不同行,表格数据相同的行

实体类

@Data
@HeadRowHeight(50)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER, wrapped = BooleanEnum.TRUE)
public class CriterionDataExportDTO {@ColumnWidth(15)@ExcelProperty(value = "所属街道")private String streetName;@ColumnWidth(25)@ExcelProperty(value = "点位类型")private String pointType;@ColumnWidth(40)@ExcelProperty(value = "测评点位")private String pointName;@ColumnWidth(50)@ExcelProperty(value = "问题明细")private String issueDetails;@ColumnWidth(15)@ExcelProperty(value = "问题笔数")private Integer issueCount;@ColumnWidth(25)@ExcelProperty(value = "二级负责单位")private String responsibleUnit2;@ColumnWidth(25)@ExcelProperty(value = "二级单位接件时间")private String assignTime2;@ColumnWidth(25)@ExcelProperty(value = "三级负责单位")private String responsibleUnit3;@ColumnWidth(25)@ExcelProperty(value = "三级单位接件时间")private String assignTime3;@ExcelIgnoreprivate Integer pushStatus;}

工具类

继承合并单元格,重写合并方法

package com.jeesite.modules.utils.easyExcel;import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.*;public class EasyExcelUtils extends AbstractMergeStrategy {private Map<String, List<Integer>> nameRowMap = new HashMap<>();@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {int columnIndex = cell.getColumnIndex();if (columnIndex == 0) {String currentValue = cell.getStringCellValue();if (currentValue == null || currentValue.isEmpty()) {return;}int currentRowIndex = cell.getRowIndex();List<Integer> rowList = nameRowMap.getOrDefault(currentValue, new ArrayList<>());rowList.add(currentRowIndex);nameRowMap.put(currentValue, rowList);mergeRows(sheet, currentValue, rowList, columnIndex);}if (columnIndex == 2) {String currentValue = cell.getStringCellValue();if (currentValue == null || currentValue.isEmpty()) {return;}int currentRowIndex = cell.getRowIndex();List<Integer> rowList = nameRowMap.getOrDefault(currentValue, new ArrayList<>());rowList.add(currentRowIndex);nameRowMap.put(currentValue, rowList);mergeRows(sheet, currentValue, rowList, columnIndex);}}private void mergeRows(Sheet sheet, String value, List<Integer> rowList, int columnIndex) {if (rowList.size() <= 1) {return;}int startRow = rowList.get(0);int endRow = rowList.get(rowList.size() - 1);// 检查是否存在重叠合并区域CellRangeAddress existingRegion = findOverlappingRegion(sheet, startRow, endRow, columnIndex);if (existingRegion != null) {// 扩展现有合并区域以适应新的合并行startRow = Math.min(existingRegion.getFirstRow(), startRow);endRow = Math.max(existingRegion.getLastRow(), endRow);// 移除现有合并区域removeMergedRegion(sheet, existingRegion);}CellRangeAddress range = new CellRangeAddress(startRow, endRow, columnIndex, columnIndex);sheet.addMergedRegionUnsafe(range);}private CellRangeAddress findOverlappingRegion(Sheet sheet, int startRow, int endRow, int columnIndex) {for (CellRangeAddress region : sheet.getMergedRegions()) {if (region.getFirstColumn() == columnIndex && region.getLastColumn() == columnIndex) {// 只考虑指定列的合并区域if (startRow <= region.getLastRow() && endRow >= region.getFirstRow()) {return region;}}}return null;}private void removeMergedRegion(Sheet sheet, CellRangeAddress region) {int index = -1;for (int i = 0; i < sheet.getNumMergedRegions(); i++) {CellRangeAddress mergedRegion = sheet.getMergedRegion(i);if (mergedRegion.equals(region)) {index = i;break;}}if (index >= 0) {sheet.removeMergedRegion(index);}}
}

调用

public void exportTaskDetails() {List<CriterionDataExportDTO> dataDetails = dataDao.findTaskDataDetails();for (CriterionDataExportDTO item : dataDetails) {//数据处理}}//写入路径String fileName =  "D:\\数据测试_" + System.currentTimeMillis() + ".xlsx";WriteCellStyle contentWriteCellStyle = new WriteCellStyle();contentWriteCellStyle.setBorderTop(BorderStyle.THIN);contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);WriteCellStyle headWriteCellStyle = new WriteCellStyle();WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short)15);headWriteCellStyle.setWriteFont(headWriteFont);HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);EasyExcel.write(fileName, CriterionDataExportDTO.class).registerWriteHandler(new EasyExcelUtils()).registerWriteHandler(horizontalCellStyleStrategy).sheet("模板").doWrite(dataDetails);}
http://www.lryc.cn/news/166742.html

相关文章:

  • Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角
  • 【洛谷 P1364】医院设置 题解(图论+深度优先搜索)
  • 【Java基础】- RMI原理和使用详解
  • 无水印免费4K视频素材网站 可商用-Free Stock Video
  • kubesphere中间件部署
  • 使用 AWS S3 SDK 访问 COS-腾讯云国际站代充
  • c语言每日一练(15)
  • 如何利用软文推广进行SEO优化(打造优质软文,提升网站排名)
  • Java线程池ExecutorService和Executors应用(Spring Boot微服务)
  • 机器学习笔记之最优化理论与方法(八)无约束优化问题——常用求解方法(中)
  • Django系列:Django简介与MTV架构体系概述
  • 锐捷交换机WEB管理系统EXCU_SHELL密码信息泄漏漏洞
  • 线性代数(六) 线性变换
  • Python基础运算分享
  • 【MySQL】mysql中有哪几种类型的备份技术?它们各自有什么优缺点?
  • 5基于pytorch的多目标粒子群算法,MOPSO,引导种群逼近真实Pareto前沿,算法运行结束后将外部存档中粒子作为获得的Pareto最优解近似。
  • 002 Linux 权限
  • 【Java 基础篇】Java可变参数:灵活处理不定数量的方法参数
  • “网站建设流程详解:从概念到上线的每个细节“
  • DC/DC开关电源学习笔记(七)低压大电流DC/DC变换技术
  • XUbuntu22.04之查找进程号pidof、pgrep总结(一百九十)
  • BI与数据治理以及数据仓库有什么区别
  • java---jar详解
  • uni-app 新增 微信小程序之新版隐私协议
  • nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(四)
  • 公交查询系统
  • opencv 轮廓顶点重新排序----四边形
  • 【项目实战】【已开源】USB2.0 HUB 集线器的制作教程(详细步骤以及电路图解释)
  • 分布式运用之rsync远程同步
  • 誉天在线项目~ElementPlus实现浏览页面注意点