easyExcel或poi导出excel合并单元格的问题(java)

EasyExcel合并相同内容单元格及动态标题功能的实现 相信很多同学都用过EasyExcel做过导出功能,现在阿Q也碰到一个需求,就是要把导出的Excel中内容相同的纵向单元格给合并,然后还需要给Excel设置动态标题,再进行格式定义调整,现将这个功能的实现过程记录下,给同学们做个参考避免踩到同样的坑......... 阅读详情

原文链接:EasyExcel导出多列相同合并处理以及单列相同合并处理_easyexcel怎么实现多个列分别合并-优快云博客
我对自定义多列相同合并策略处理类进行了一些修改,原文进行多行合并的时候会导致报错(上一行已合并的问题),所以处理了一下重新添加合并单元的逻辑,代码如下:
 

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * @ClassName:ExcelMergeCustomerCellHandler @Description:easyexcel合并策略处理类,多列相同合并策略 @Version:1.0 @Date:2023/9/7
 * 09:36:52
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExcelCellByMultiHandler implements CellWriteHandler {

  /** 用第几行开始合并 ,默认为1,因为第0行是标题,EasyExcel 的默认也是 */
  private int mergeRowIndex = 1;

  /** 参与合并的列,起始列位置,默认为0 */
  private int mergeColumnStart = 0;

  /** 参与合并的列,最后一列的位置,默认为4 */
  private int mergeColumnEnd = 4;

  /*
   * 在对单元格的所有操作完成后调用
   */
  @Override
  public void afterCellDispose(
      WriteSheetHolder writeSheetHolder,
      WriteTableHolder writeTableHolder,
      List<WriteCellData<?>> list,
      Cell cell,
      Head head,
      Integer integer,
      Boolean aBoolean) {
    // 当前行
    int curRowIndex = cell.getRowIndex();
    // 当前列
    int curColIndex = cell.getColumnIndex();
    if (curRowIndex > mergeRowIndex && curColIndex >= mergeColumnStart) {
      // 读取到mergeColumnEnd ,开始调用合并方法
      if (curColIndex == mergeColumnEnd) {
        mergeWithPrevRow(writeSheetHolder, cell, curRowIndex);
      }
    }
  }

  /**
   * @Description: 合并比较多列值是否相同 @Date: 2023/9/8 16:31 @Param writeSheetHolder: 通过此对象获取sheet等信息 @Param
   * cell: 当前单元格 @Param curRowIndex: 当前行
   *
   * @return: void
   */
  private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex) {
    StringBuilder curString = new StringBuilder();
    StringBuilder preString = new StringBuilder();
    for (int i = mergeColumnStart; i <= mergeColumnEnd; i++) {
      Cell curCell = cell.getSheet().getRow(curRowIndex).getCell(i);
      Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(i);
      // 根据单元格类型获取单元格的值
      Object curData =
          curCell.getCellType() == CellType.STRING
              ? curCell.getStringCellValue()
              : curCell.getNumericCellValue();
      Object preData =
          preCell.getCellType() == CellType.STRING
              ? preCell.getStringCellValue()
              : preCell.getNumericCellValue();
      curString.append(curData);
      preString.append(preData);
    }
    // 比较当前行的单元格与上一行是否相同,相同合并当前单元格与上一行
    if (curString.toString().equals(preString.toString())) {
      Sheet sheet = writeSheetHolder.getSheet();
      // 获取合并信息
      boolean isMerged = false;
      // 下标
      for (int j = 0; j <= mergeColumnEnd; j++) {
        List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
        for (int i = 0; i < mergeRegions.size(); i++) {
          CellRangeAddress cellRangeAddr = mergeRegions.get(i);
          // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
          if (cellRangeAddr.isInRange(curRowIndex - 1, j)) {
            sheet.removeMergedRegion(i);
            cellRangeAddr.setLastRow(curRowIndex);
            sheet.addMergedRegion(cellRangeAddr);
            isMerged = true;
            break;
          }
        }
      }
      if (!isMerged) {
        for (int i = 0; i <= mergeColumnEnd; i++) {
          CellRangeAddress cellRangeAddress =
              new CellRangeAddress(curRowIndex - 1, curRowIndex, i, i);
          sheet.addMergedRegion(cellRangeAddress);
        }
      }
    }
  }
}

上面的三个参数根据实际导出情况自行调整

【Java】POI 解析有合并单元格的 Excel POI 解析有合并单元格的 Excel 阅读详情

相关推荐

避坑指南:EasyExcel填充数据时合并单元格失效?3种解决方案实测有效

本文深入剖析了使用EasyExcel进行数据填充时合并单元格失效的根本原因,并提供了三种实测有效的解决方案。针对这一常见开发痛点,文章详细讲解了如何通过自定义合并策略处理器、基于数据的事后合并以及巧妙的模板设计来根治问题,帮助开发者生成结构规整、专业美观的Excel报表。

c2d3e4f的博客 1198

easyexcel内容追加与单元格合并

excel单元格合并与内容追加,单元格合并需要注册单元格处理器CellWriteHandler,内容追加,需要以现有的文件为模板,生成新的文件。

feinifi的博客 5154

EasyExcel使用及自定义设置单元格样式

固定模板方式,首先创建要Excel数据列模板;当然EasyExcel 中也可以动态自定义表头,其实都差不多一样 下面案例中,我采用一个固定模板方式,主要记录下,如何自定义单元格样式 这里是导出方法,主要是绑定样式,指定Excel文件生成的路径 public static String ExcelWrite(ExportParamDto excelData) { String fileName = getPath() + System.currentTimeMillis(..

DN金猿的博客 2万+

Java easyexcel填充Excel(包含公式)

【代码】Java easyexcel填充excel(包含公式)

weixin_50272584的博客 4663

零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)

本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。

weixin_30733003的博客 542

电路设计学习一:DAC/ADC原理

文章目录参考文献DAC基本原理DAC分类倒T型电阻网络权电流转换器DAC的性能指标分辨率转换速度ADC基本原理ADC分类ADC的性能指标ADC的位数分辨率基准源转换速率量化误差 参考文献 DAC数模转换/ADC模数转换 单片机 AD/DA数模转换 模数转换(A/D)与数模转换(D/A) DAC基本原理 DAC将输入的数字量按权的大小,通过电阻网络转化为模拟量,再通过加法电路,转换为与数字量成比例的模拟量。 实际上就是二进制转换为十进制的过程。 基本组成包括锁存器、电子开关、基准源、权电阻网络和求和电路。 锁

coin的博客 3万+

EasyExcel的CellWriteHandler注入CellStyle不生效

类里发现确实有覆盖样式的操作,如下图:(ps:原本的2.2.7版本里是没有这个类的)方法,看这个方法名就能看出来,还要对 handler 进行排序和清理,再看下面。, 再排序清理一次,看到这里大概可以猜到了,估计我们自定义的。最近发现原本项目的导出excel功能中,写的那些。,经过排序清理之后,并不在最后,样式估计被后面的。,版本跨度比较大,所以怀疑是升级导致的问题。要解决问题,很简单,只要让我们自定义的。覆盖了,我们看下排序清理后的结果。,这3个逐个看了下源码,最终在。的源码,我们注册自定义的。

dongdong199033的博客 4082

保姆级教程:用PROGRAM_FTDI搞定Xilinx FPGA的JTAG调试器(基于FT232/FT2232/FT4232)

本文详细介绍了如何使用FT232/FT2232/FT4232系列芯片通过PROGRAM_FTDI工具配置Xilinx FPGA的JTAG调试器。从芯片选型、驱动安装到固件烧写和Vivado验证,提供了完整的实操指南和避坑要点,帮助开发者低成本实现高效调试。

weixin_29271053的博客 2170

EasyExcel导入存在合并单元格的Excel

Excel表格 下面是Excel表格,成果简介前可以作为主表数据存储(存在合并),成果简介后的数据作为从表数据存储。 实现思路 通过EasyExcel读取Excel数据,用List<AwardsDetailField> list接收 因为POI/EasyExcel对合并单元格的数据只读取一次,需要把为空的单元格也赋值,这是核心技术难点。 对数据进行校验、封装然后写入数据库 存在校验不通过的数据返回给前端,所有数据校验通过写入数据库。 相关代码 下面贴出的是通过EasyExcel读取Exce

我可能在扯淡 1万+

(3万字深度解析)Kaggle《房价预测:高级回归技巧》详解复现攻略

在这篇教程式文章中,我们从零开始完成了 Kaggle《房价预测:高级回归技巧》比赛的复现工作,涵盖了数据预处理、特征工程、模型训练、调优、解释和融合的完整流程。深入理解数据:阅读数据描述,结合常识对每个特征作出合理处理(如缺失值填充’None’表示无此设施 、异常值剔除 等)。对目标和偏态特征进行对数变换,使分布更平滑,从而更好满足模型假设并提升准确度。特征工程:我们创造了总面积、总浴室等新特征,整合信息提高模型可学习性。

qq_38334677的博客 1775

NXP S32K3xx 多次复位(reset)后MCU跑死、崩溃、出错分析

s32k3出现多次复位后死机的情况

HeFlyYoung的博客 9515

easyExcel - 导出合并单元格

之前有介绍过如何使用 easyExcel,以及写了两个入门的 demo ,这两个 demo 能应付在开发中大多数的导入和导出需求,不过有时候面对一些复杂的表格,就会有点不够用,该篇就是关于如何实现导出合并单元格将相同订单号的单元格进行合并将相同订单号的单元格进行合并,且同一订单号的总数和总金额进行合并将相同订单号的单元格进行合并,且同一订单号的总数和总金额进行合并,订单内相同商品分类进行合并,且分类总数和分类总金额根据订单号和商品分类进行合并将表中数据相同部分进行左右合并,上下合并。

xhmico的博客 1万+

uniapp(全端兼容)-最新详细实现接入腾讯云IM即时通讯教程,uniapp在安卓苹果app端/小程序/h5移动端等集成使用腾讯云im插件,提供消息列表与聊天对话示例,支持发图片/私聊/实时监听消息

uni-app,腾讯云IM,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,im即时通讯,腾讯云IM详细教程,如何接入腾讯IM即时通讯,使用腾讯im有没有插件,怎么使用腾讯云IM插件,tim-wx-sdk,聊天sdk,即时通讯im uniapp私聊/群聊/聊天室,实现IM即时通讯仿微信聊天功能,对接腾讯云IM+音视频,调用腾讯即时通信IM的示例,卡顿很卡不流畅,音视频,全局监听,仿微信IM,uni-huanxin-im,sdk,实现多端实时通

✅ 精选推荐文章 1万+

EasyExcel导出动态合并单元格策略

EasyExcel导出动态合并单元格策略 1.导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> 2.合并单元格工具类 import com.alibaba.

weixin_50067580的博客 6674

Labview邪修01:贪吃蛇小游戏

摘要:博主使用LabVIEW 2020(32位)复刻了经典贪吃蛇游戏。程序具备随机生成蛇(初始长度3)和食物、三档速度调节、键盘方向控制等功能,碰撞边界或自身即游戏结束。实现过程包括:1)界面设计,使用二维颜色盒数组构建游戏区,添加速度枚举控件和功能按钮;2)程序架构,采用模块化设计包含Main.vi、Start.vi等6个核心VI,分别处理初始化、位置计算、碰撞检测等逻辑;3)事件驱动机制,通过开始/结束事件、按键响应和超时循环实现游戏流程控制。运行时可实时显示分数,完整还原了贪吃蛇的核心玩法。

weixin_38637405的博客 972

时间序列预测 | Python实现LSTM时间序列数据预测

目录LSTM神经网络LSTM原理LSTM数据下载LSTM程序设计导入Python包时序数据处理LSTM模块定义模型训练模型评估参数设定运行结果参考资料致谢 LSTM神经网络 长短期记忆网络——通常简称为“LSTM”——是一种特殊的 RNN,能够学习长期依赖关系。它们由Hochreiter & Schmidhuber (1997)引入,并在后续工作中被许多人提炼和推广。1它们在处理各种各样的问题时效果非常好,现在被广泛使用。LSTM 被明确设计为避免长期依赖问题。长时间记住信息实际上是他们的默认行为

前程算法屋的博客 3912

【easyexcel根据数据相同导出动态合并单元格】

添加pom依赖 <!-- 阿里开源easyexcel--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.0-beta2</version> </dependenc.

weixin_45559862的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

EasyExcel解析合并单元格@ExcelProperty

根据名称解析-value 本质上来说,根据名称解析也是获取到名称对应的下标/索引进行解析,如果是根据索引进行解析,不需要名称对应转换步骤即可 使用方式为:new ExcelAnalysisHelper().getList(file, T.class); @ExcelProperty(value = “序号”,index = 1),其中value为名称,index为索引 根据索引解析可参考(我也是参考别人的文档):根据索引解析 ExcelAnalysisHelper package com.meiyuan

均衡之道 4万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

easyexcel 导出导入合并单元格的表格

easyexcel 导入、导出合并单元格的表格 现在经常遇到导入导出表格,又有列重复的数据,想要合并,手动有太慢的(所以直接导入或导入和并的表格) 1. 引入pom 引入pom 参考 java导入Excel(使用阿里巴巴的easyexcel) 2. 导出合并的表格 编写Controller: @GetMapping("/exportExcel") public void exportExcel() throws IOException { HttpServletResponse respon

张凯强的博客 5303

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

当觉得自己菜的时候,就应该静下心来学习 6827

easyexcel 合并单元格(非注解)

引入 jar <!--引入 阿里的 easyexcel 同时需要引入 asm 或者 cglib--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.4</version&

小白的技术之路 1万+

使用EasyExcel导出表格时合并单元格

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

iiopsd的博客 1万+

Java Excel文件导出POI合并单元格

使用POI导出Excel文件 private XSSFWorkbook writeExcel(List<SupplyKcPlan> list) { if(CollectionUtils.isEmpty(list)){ return new XSSFWorkbook(); } XSSFWorkbook wb = new XSSFWorkbook(); Map<String, CellStyle> styles = createStyles(wb); XSSFS

haixin_wu的博客 1207

【实战技巧】EasyExcel合并单元格数据填充全解析

本文深入解析了使用EasyExcel处理合并单元格数据填充的实战技巧。针对合并单元格读取时数据缺失的核心痛点,详细阐述了EasyExcel的`extra`事件机制,并提供了完整的代码示例,指导开发者如何通过`CellExtra`对象获取合并区域信息,实现将左上角单元格的值精准填充到整个合并区域,从而确保导入数据的完整性和准确性。

hadoop5ranger的博客 1084

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

if (head.getColumnIndex() == 0 || head.getColumnIndex() == 4) { // 第一列和第五列。@ExcelProperty({"引导车开始", "开始_终端误差(s)"})@ExcelProperty({"引导车结束", "结束_终端误差(s)"})@ExcelProperty({"引导车开始", "开始_分析误差"})@ExcelProperty({"引导车结束", "结束_分析误差"})// 合并"引导车误差分析"标题。

坐观垂钓者 915

easyexcel导出&自定义策略合并单元格

easyExcel导出&excel单元格合并策略

weixin_44673447的博客 3939
Pollo_
博客等级 码龄5年 15粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值