easyExcel 使用策略实现 单元格 合并
如何使用
// 0,1 表示 对1,2列启用合并策略
EasyExcel.write(fileName, Model.class)
.registerWriteHandler(new MergeStrategy(data().size(),0,1))
.sheet("通用合并行策略")
.doWrite(data());
代码实现
import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import org.apache.commons.collections.map.HashedMap; 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 MergeStrategy extends AbstractMergeStrategy {// 合并的列编号,从0开始,指定的index或自己按字段顺序数private Set<Integer> mergeCellIndex = new HashSet<>();// 数据集大小,用于区别结束行位置private Integer maxRow = 0;// 禁止无参声明private MergeStrategy() {}public MergeStrategy(Integer maxRow, int... mergeCellIndex) {Arrays.stream(mergeCellIndex).forEach(item -> {this.mergeCellIndex.add(item);});this.maxRow = maxRow;}// 记录上一次合并的信息private Map<Integer, MergeRange> lastRow = new HashedMap();// 每行每列都会进入,绝对不要在这写循环@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {int currentCellIndex = cell.getColumnIndex();// 判断该行是否需要合并if (mergeCellIndex.contains(currentCellIndex)) {String currentCellValue = cell.getStringCellValue();int currentRowIndex = cell.getRowIndex();if (!lastRow.containsKey(currentCellIndex)) {// 记录首行起始位置lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));return;}//有上行这列的值了,拿来对比.MergeRange mergeRange = lastRow.get(currentCellIndex);if (!(mergeRange.lastValue != null && mergeRange.lastValue.equals(currentCellValue))) {// 结束的位置触发下合并.// 同行同列不能合并,会抛异常if (mergeRange.startRow != mergeRange.endRow || mergeRange.startCell != mergeRange.endCell) {sheet.addMergedRegionUnsafe(new CellRangeAddress(mergeRange.startRow, mergeRange.endRow, mergeRange.startCell, mergeRange.endCell));}// 更新当前列起始位置lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));}// 合并行 + 1mergeRange.endRow += 1;// 结束的位置触发下最后一次没完成的合并if (relativeRowIndex.equals(maxRow - 1)) {MergeRange lastMergeRange = lastRow.get(currentCellIndex);// 同行同列不能合并,会抛异常if (lastMergeRange.startRow != lastMergeRange.endRow || lastMergeRange.startCell != lastMergeRange.endCell) {sheet.addMergedRegionUnsafe(new CellRangeAddress(lastMergeRange.startRow, lastMergeRange.endRow, lastMergeRange.startCell, lastMergeRange.endCell));}}}} }class MergeRange {public int startRow;public int endRow;public int startCell;public int endCell;public String lastValue;public MergeRange(String lastValue, int startRow, int endRow, int startCell, int endCell) {this.startRow = startRow;this.endRow = endRow;this.startCell = startCell;this.endCell = endCell;this.lastValue = lastValue;} }
easyExcel 使用策略实现 单元格 合并相关推荐
- easyexcel内容追加与单元格合并
这里的需求是,如果表格不存在,则新建表格,并填入数据,如果表格存在,那么就追加内容,并且支持单元格合并. 内容追加,需要分两种方式插入,第一种就是没有表格,需要生成表头,并且插入内容,第二种就是已经有 ...
- EasyExcel 动态表头 + 数据单元格合并
前言 本文想要达到以及最终实现的效果: 要实现这种效果,包含两个部分的操作: 1. 动态表头 EasyExcel 生成 Excel 时要使表头有合并效果,可以采用**注解和非注解(动态表头)**的方法 ...
- easyexcel复杂表格---包含单元格合并,表格标题,以及自定义字段写入
工作当中,遇到一个需要复杂表格的设计,第一次用easyexcel,在这里记录一下,看到的小伙伴大家一起进步. 需求 话不多说直接上图,大概就是需要这种格式的excel,根据选择下载的个数分成多个she ...
- 关于使用EasyExcel进行单元格合并的问题
关于使用EasyExcel进行单元格合并的问题 1.项目场景: 简介:报销单导出要根据指定的excel模板去自动替换对应,然后重新生成一份新的excel.在给定的excel模板中,有部分字段进行了单元 ...
- 【EasyExcel】EasyExcel列表填充数据时指定单元格合并
EasyExcel列表填充数据时指定单元格合并 package com.susing.security.handler;import com.alibaba.excel.metadata.CellDa ...
- EasyExcel对列同类项进行单元格合并
EasyExcel对列同类项进行单元格合并 <dependency><groupId>com.alibaba</groupId><artifactId> ...
- EasyExcel:利用模板进行填充字段,生成公式处理,监听单元格填充后触发事件,相同日期单元格合并
EasyExcel EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https://github.c ...
- 阿里 easyExcel 动态写入数据,多级表头,单元格合并示例
excel写入流程 public static void main(String[] args) throws Exception {//标题List<List<String>> ...
- EasyExcel v2.1.6单元格样式设置
EasyExcel v2.1.6单元格样式设置 1.实体类代码 2.注解类 3.自定义注解类实现 4.导出Excel文件实现类 使用AlibabaEasyExcel v2.1.6导出excel文件,的 ...
最新文章
- jquery 实现表单验证功能代码(简洁)
- windows terminal 笔记
- #4604. The kth maximum number(整体二分 + 树套树)
- PE文件感染和内存驻留
- matlab如何用代码导入文件_20+行Matlab代码实现文件扫描
- 使用NAS动态存储卷创建有状态应用
- Java基础---认识抽象类
- bootstrap-multiselect.js多选下拉框初始化时默认选中初始值
- 20150823 命令练习总结
- 刘逖:ETF市场迎来发展时机 可从产品创新等方面推动
- 【优化算法】世界杯优化算法(WCOA)【含Matlab源码 1427期】
- 【Android Audio 入门 五】--- AudioSW介绍
- 数据库索引原理及优化
- python之字符串(str)和编码
- elementUI 日 周 月 季 年 时间选择控件封装
- Linux运维学习路线
- SDK manger中只有几个配置????
- [爱情智慧]爱作的女人,最后都不怎么好!学会述情才能婚姻幸福!
- 一文彻底理解评分卡开发中——Y的确定(Vintage分析、滚动率分析等)
- 深度学习实战(六):从零开始实现表情识别