easyExcel合并单元格策略
合并行:
import com.alibaba.excel.metadata.CellData;
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 lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;/*** 合并单元格*/
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {/*** 合并字段的下标*/private int[] mergeColumnIndex;/*** 合并几行*/private int mergeRowIndex;public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {this.mergeRowIndex = mergeRowIndex;this.mergeColumnIndex = mergeColumnIndex;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer integer, Boolean aBoolean) {}public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {//当前行int curRowIndex = cell.getRowIndex();//当前列int curColIndex = cell.getColumnIndex();if (curRowIndex > mergeRowIndex) {for (int i = 0; i < mergeColumnIndex.length; i++) {if (curColIndex == mergeColumnIndex[i]) {mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);break;}}}}private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() :cell.getNumericCellValue();Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() :preCell.getNumericCellValue();// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行if (curData.equals(preData)) {Sheet sheet = writeSheetHolder.getSheet();List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();boolean isMerged = false;for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {CellRangeAddress cellRangeAddr = mergeRegions.get(i);// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {sheet.removeMergedRegion(i);cellRangeAddr.setLastRow(curRowIndex);sheet.addMergedRegion(cellRangeAddr);isMerged = true;}}// 若上一个单元格未被合并,则新增合并单元if (!isMerged) {CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex,curColIndex);sheet.addMergedRegion(cellRangeAddress);}}}
}
合并列:
import com.alibaba.excel.metadata.CellData;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;/*** 自定义合并某行某列*/
public class ExcelFillCellMergePrevCol implements CellWriteHandler {/*** 合并字段的下标*/private int[] mergeColumnIndex;//合并哪一行private int row;//合并多少列private int num;public ExcelFillCellMergePrevCol(int[] mergeColumnIndex, int row, int num) {this.mergeColumnIndex = mergeColumnIndex;this.row = row;this.num = num;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {//当前行int curRowIndex = cell.getRowIndex();//当前列int curColIndex = cell.getColumnIndex();//合并最后一行指定列if (curRowIndex == row) {for (int i = 0; i < mergeColumnIndex.length; i++) {if (curColIndex == mergeColumnIndex[i]) {// 合并最后一行 ,列mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, curColIndex);}}}}private void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {Sheet sheet = writeSheetHolder.getSheet();CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + num);sheet.addMergedRegion(cellRangeAddress);}}
easyExcel合并单元格策略相关推荐
- EasyExcel合并单元格策略样例
EasyExcel合并单元格策略样例 运行示例 处理前: 处理后: 说明 本次使用的是一次性绝对合并策略: List<OnceAbsoluteMergeStrategy> mergeStr ...
- Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略)
Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略) 适用于多张表(只查单表数据就用创建对象那种方法) Controller @RequestMapping(value = ...
- EasyExcel合并单元格,通过注解方式实现自定义合并策略
EasyExcel合并单元格,通过注解方式实现自定义合并策略 简介 今天博主探讨如何实现EasyExcel自定义实现单元格合并策略,考虑需要抽象代码.适用于更多的业务场景,提供了两个工具类,参考过很多 ...
- easyexcel 合并单元格
easyexcel 合并单元格 ********************* 相关注解 ContentLoopMerge:标注在字段上 @Target({ElementType.FIELD}) @Ret ...
- EasyExcel合并单元格(同列相同数据合并)
合并后效果如下: 合并策略代码: public class CustomMergeStrategy extends AbstractMergeStrategy {/*** 分组,每几行合并一次*/pr ...
- EasyExcel合并单元格
文章目录 需求 思考 实现 需求 EasyExcel默认情况下写Excel是一行一行的,单元格不会自动合并,现在需求是合并这几列中相同的数据 思考 开始自己也不想做过多改动代码,经过阅读EasyExc ...
- EasyExcel合并单元格(一)
前言 导出excel,介绍如何使用LoopMergeStrategy实现简单的合并 效果 每隔2行,合并一次 横向合并 横向和纵向合并 实现 导入依赖 <!-- https://mvnrepos ...
- 阿里开源 Easy-Excel合并单元格数据
最终效果图 废话不多说,直接上代码 导入阿里云依赖jar包 封装实体类: 开始编写合并单元格: 组装数据的方法: 打完收工...欢迎大家来交流
- easyexcel 列头合并_2020-05-19:EasyExcel自定义合并单元格
public static void writeExcelWithHeadAndData(OutputStream outputStream, List> head, List> body ...
最新文章
- python将图像转换为8位单通道_Python OpenCV读取16位单通道图像并转换为8位灰度图显示...
- 内存分配_go内存分配管理
- HTML的布局的小秘密
- Codeforces 603A Alternative Thinking
- 物理化学 化学 动力学(上)
- 关键词分词工具_快图制作工具 | 如何制作词云图?
- 快速入门 Jupyter notebook
- HTTP响应码及其含义
- C++ const与static
- html网页设计插件,适用于网页设计的Photoshop插件包
- 双线性对在密码学中的应用(上)
- java图形验证码去除干扰,使用python 对验证码图片进行降噪处理
- centos7安装ifconfig命令
- KubeEdge环境搭建(支持网络插件flannel)
- CentOS7 Java应用文件名乱码问题解决(文件下载和创建文件导致的文件名乱码)
- QQ音乐播放器-jQuery实现
- 笔试总结——0310华为软笔C++
- 世界美好与你环环相扣_吉他谱_C调简单版
- 微型计算机的软 硬件组成,微型计算机的软、硬件组成及主要性能指标
- PHP广告横幅在线制作网站源码