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

使用EasyExcel 导出复杂的合并单元格

引入pom.xml

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
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.HashMap;
import java.util.Map;public class CustomMergeStrategy extends AbstractMergeStrategy {private final int[] mergeColumns;  // 需要合并的列索引private final int startRow;        // 开始合并的行号private Map<Integer, MergeRange> lastValueMap = new HashMap<>();public CustomMergeStrategy(int[] mergeColumns, int startRow) {this.mergeColumns = mergeColumns;this.startRow = startRow;}@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {int currentRow = cell.getRowIndex();if (currentRow <= startRow) return;for (int col : mergeColumns) {if (cell.getColumnIndex() == col) {String currentValue = cell.getStringCellValue();MergeRange lastRange = lastValueMap.get(col);if (lastRange != null && lastRange.value.equals(currentValue)) {// 合并到上一个范围sheet.addMergedRegion(new CellRangeAddress(lastRange.startRow, currentRow, col, col));lastValueMap.put(col, new MergeRange(lastRange.startRow, currentValue));} else {// 新值范围开始lastValueMap.put(col, new MergeRange(currentRow, currentValue));}break;}}}private static class MergeRange {int startRow;String value;MergeRange(int startRow, String value) {this.startRow = startRow;this.value = value;}}
}

完成列头合并

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;public class ComplexHeadStrategy implements CellWriteHandler {public void afterCellDispose(WriteSheetHolder writeSheetHolder,WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {if (head.getColumnIndex() == 0 || head.getColumnIndex() == 4) { // 第一列和第五列Sheet sheet = writeSheetHolder.getSheet();if (cell.getRowIndex() == 0) { // 首行// 合并"引导车误差分析"标题sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1 // 合并前两列));sheet.addMergedRegion(new CellRangeAddress(0, 0, 4, 5 // 合并最后两列));}}}
}

Demo实现

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import lombok.Data;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;import java.util.ArrayList;
import java.util.List;public class MergeCellExportDemo {public static void main(String[] args) {List<FlightData> dataList = new ArrayList<>();dataList.add(new FlightData("0.12", "0.5", "B-1234", "A01", "0.08", "0.3"));dataList.add(new FlightData("0.15", "0.6", "B-5678", "B02", "0.09", "0.4"));// 自定义合并策略(合并机号列)CustomMergeStrategy mergeStrategy = new CustomMergeStrategy(new int[]{2, 3}, 1 // 合并第3、4列(机号/机位));// 设置表头样式WriteCellStyle headStyle = new WriteCellStyle();headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());WriteCellStyle contentStyle = new WriteCellStyle();contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);HorizontalCellStyleStrategy styleStrategy =new HorizontalCellStyleStrategy(headStyle, contentStyle);EasyExcel.write("flight_report.xlsx").head(FlightData.class).registerWriteHandler(new ComplexHeadStrategy()) // 复杂表头处理.registerWriteHandler(mergeStrategy).registerWriteHandler(styleStrategy).sheet("航班数据").doWrite(dataList);}// 数据模型类(对应图片中的列)@Datastatic class FlightData {@ExcelProperty({"引导车开始", "开始_分析误差"})private String startAnalysisError;@ExcelProperty({"引导车开始", "开始_终端误差(s)"})private String startTerminalError;@ExcelProperty("机号")private String flightNumber;@ExcelProperty("机位")private String gate;@ExcelProperty({"引导车结束", "结束_分析误差"})private String endAnalysisError;@ExcelProperty({"引导车结束", "结束_终端误差(s)"})private String endTerminalError;public FlightData(String startAnalysisError, String startTerminalError, String flightNumber,String gate, String endAnalysisError, String endTerminalError) {this.startAnalysisError=startAnalysisError;this.startTerminalError=startTerminalError;this.flightNumber=flightNumber;this.gate=gate;this.endAnalysisError=endAnalysisError;this.endTerminalError=endTerminalError;}}
}
http://www.dtcms.com/a/342575.html

相关文章:

  • 第四届中国高校机器人实验教学创新大赛团队参赛总结
  • selenium一些进阶方法如何使用
  • 大模型0基础开发入门与实践:第11章 进阶:LangChain与外部工具调用
  • 打破传统课程模式,IP变现的创新玩法 | 创客匠人
  • 从零开始学 Selenium:浏览器驱动、元素定位与实战技巧
  • 微服务:现代软件架构的主流范式
  • Linux mmap内存映射
  • 集中式负载均衡 vs. 分布式负载均衡
  • 【赵渝强老师】Redis Cluster分布式集群
  • #千问海报大赛
  • 订单簿动力学与深度学习模型的融合大单识别与短期市场价格波动预测
  • Java多线程编程基础篇
  • 多级缓存一致性矩阵:ABP vNext 下的旁路 / 写穿 / 写回组合实战
  • Qt的moveToThread使用
  • SQL-leetcode—3451. 查找无效的 IP 地址
  • centos常用命令
  • Visual Studio Code (VS Code) 工作区配置文件的作用
  • CentOS7安装部署NexusRepository
  • 【Spring Cloud 微服务】2.守护神网关Gateway
  • 告别人工建模:AI 自动化 ETL 工具对比,数据 pipeline 搭建时间缩短 60% 的实践
  • 洛谷 P2656 采蘑菇-普及+/提高
  • k 均值聚类算法总结
  • 从入门到精通:Java设计模式——单例模式
  • 8.21IPSEC安全基础后篇,IKE工作过程
  • 【TWT】
  • 常德二院信创转型实战:全栈国产化提升医疗效率与安全
  • 嵌入式linux设备升级和sm32升级对比
  • 计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
  • el-table-draggable拖拽实现表格内容排序
  • VUE从入门到精通二:ref、reactive、computed计算属性、watch监听、组件之间的通信