java-easyExcel导出-合并单元格

Ruoyi框架使用easyExcel实现单元格合并 / 你也可以在创建行的时候进行拦截,也可以在创建单元格的时候拦截,不同功能实现不同的接口 public class TableHeadHandler implements SheetWriteHandler {// 基础的excel操作,可以在此处添加表头的样式 Workbook workbook = writeWorkbookHolder . getWorkbook();row0 . createCell(0) . setCellValue("第一行"); 阅读详情

实现层:

public ResultDto statisticalBudgetDetailExport(HttpServletResponse response, ReimbursementFormDTO formDTO) {
        List<Map<String, Object>> mapValueList = (List<Map<String, Object>>) formDTO.getParamsMap();

        //获取所需数据
        List<Map<String, Object>> list = new ArrayList<>();
        for (Map<String, Object> mapValue : mapValueList) {
            Map<String, Object> map = new HashMap<>();

            map.put("thirdDept", "");
            
            list.add(map);
        }

        //写入数据
        String fileName = "导出";

        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");

            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .withTemplate(this.getClass().getClassLoader().getResourceAsStream("templates/statisticalBudgetDetailExport.xlsx"))
                    .registerWriteHandler(new ExcelFillCellMergeStrategy(1,new int[]{0,1}, list.size()))
                    .build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();

            // 直接写入数据
            excelWriter.fill(list, fillConfig, writeSheet);

            excelWriter.finish();
        } catch (Exception e) {
            return null;
        }
        return null;
    }

合并策略:

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;

    private int lastRow;

    int num = 0;

    public ExcelFillCellMergeStrategy() {
    }

    public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex, int lastRow) {
        this.mergeRowIndex = mergeRowIndex;
        this.mergeColumnIndex = mergeColumnIndex;
        this.lastRow = lastRow;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override
    public 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) {

    }

    @Override
    public 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;
                }
            }
        }

        //合并最后一行指定列
        if (curRowIndex == lastRow) {
            if (num == 0) {
                // 合并最后一行 1,2 列
                mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, 1);
            }
            num ++;
        }
    }

    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);
            }
        }
    }
    private void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
        Sheet sheet = writeSheetHolder.getSheet();
        CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + 1);
        sheet.addMergedRegion(cellRangeAddress);
    }
}

easyexcel复杂模板导出(合并行列,列统计汇总) easyexcel复杂模板导出 阅读详情

相关推荐

实战演练,如何用Easyexcel合并单元格,设置字体、边框样式,并在尾行加入备注

,实现效果如下:1、多级表头合并2、表头底纹+表格边框3、合并相同数据单元格4、尾行加入备注。

Su7148的博客 1万+

easyExcel自动合并单元格

来源EasyExcel(根据条件动态合并单元格的重复数据) package com.ustcinfo.fn.comp.complain.util; 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

weixin_43891731的博客 4514

java easyexcel主子表报表打印

java// 自定义样式策略@Override@Override// 标题样式// 数据行样式else {// 金额列右对齐@Override然后在导出时注册这个样式策略:java.build();EasyExcel 提供了灵活的方式来实现主子表结构的报表导出,主要有两种方式:使用多个 sheet 分别展示主表和子表数据在单个 sheet 中使用合并单元格的方式展示主子表关系。

leijmdas的专栏 1355

EasyExcel合并单元格,通过注解方式实现自定义合并策略

今天博主探讨如何实现EasyExcel自定义实现单元格合并策略,考虑需要抽象代码、适用于更多的业务场景,提供了两个工具类,参考过很多博主的方案,并整合优化了一下。

q1468051413的博客 6594

信号输入到底要不要接GND?单端与差分输入的接地选择与抗干扰分析

在电子工程与工业现场中,接地是信号完整性的基石。电压本身是相对值,任何测量都需要一个公共参考点,这就是地(GND)在信号输入中的核心作用。单端输入依赖信号源与接收端共地,以GND为基准还原信号;差分输入则直接测量两根信号线之间的差值,天然不依赖本地地电位,因此能有效抑制共模干扰和地环路噪声。实际选型时,需要根据传感器类型、传输距离、地电位差大小权衡:短距离共地良好的场景可用单端,长距离或高干扰环境应优先考虑差分或隔离方案。本文从接地原理出发,结合实际接线与故障排查经验,帮助工程师在PLC、采集卡和传感器链路

weixin_28703507的博客 311

STM32 BLDC无刷电机霍尔信号捕获与换相控制实战解析

本文深入解析了STM32如何实现BLDC无刷电机的霍尔信号捕获与换相控制。详细阐述了硬件接口配置、定时器霍尔传感器模式的使用、抗干扰的滤波器与软件容错设计,以及中断服务与换相逻辑的实战代码。重点解决了信号抖动、换相不准等常见问题,旨在帮助开发者构建稳定可靠的电机驱动基础。

weixin_29193259的博客 368

easyExcel - 导出合并单元格

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

xhmico的博客 1万+

逆向分析第一步:如何从HEX文件‘还原’出单片机的原始程序与数据?

本文详细解析了如何从HEX文件逆向分析出单片机的原始程序与数据,涵盖了固件逆向的底层逻辑与实践。通过介绍HEX文件的结构、内存映像重建技术以及专业工具链的使用,帮助读者掌握从十六进制数据到可执行代码的完整流程,适用于嵌入式系统开发和逆向工程领域。

weixin_29745609的博客 317

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

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

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

2 海康视觉平台VisionMaster 上手系列:大纲及准备

海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 1万+

ESWA投稿全流程避坑指南:从LaTeX模板到审稿状态查询(附最新资源链接)

本文提供了一份详尽的ESWA期刊投稿全流程指南,涵盖从LaTeX模板深度适配、Cover Letter撰写,到Editorial Manager系统操作、审稿状态解析等关键环节。重点解析了投稿准备中的常见“雷区”与文件合规性要求,并分享了收到审稿意见后的高效修改与回复策略,旨在帮助研究者规避流程陷阱,提升投稿效率与成功率。

9o8p7i6u5y的博客 838

Java中使用alibaba easyexcel导出Excel,合并单元格

Java中导出xlsx文件,合并单元格,简单上手

SUMMERENT的博客 6157

进阶05:Labview与汇川PLC通过OPC UA通信(AM500系列)

本文介绍了LabVIEW与汇川PLC通过OPC UA通信的实现方法。主要内容包括:1)编写汇川AM521 PLC结构化文本程序,配置OPC UA服务器并导出变量;2)使用UaExpert客户端测试读取PLC变量;3)开发C#封装库实现OPC UA连接、读写和订阅功能;4)在LabVIEW中创建通信类,封装dll功能;5)设计LabVIEW界面实现变量读写和PLC程序触发。最终实现了PLC变量监控、数据读写及Y1-Y4输出控制功能,为自动化系统开发提供了基础框架。

weixin_38637405的博客 1302

EasyExcel导出Excel文件——合并单元格多层级数据导出

数据映射:利用Map和Stream API进行数据转换,提高代码的可读性和效率。HTTP响应处理:设置正确的响应头以实现文件下载,以及解决中文乱码问题。EasyExcel库:简化Excel文件的生成和读取过程,提升开发效率。单元格合并:通过自定义策略实现Excel中数据的分组和单元格合并,提升报表的可读性。

2401_87704405的博客 924

【STM32实物】基于STM32设计的智能仓储管理系统

近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,识别以及对仓储环境条件的要求成为仓储的重要决策,他们可以根据不同的特点在不同场景中使用。本文详细介绍了一个基于单片机技术的智能仓储管理系统的设计与实现,这个系统可谓是集射频识别(RFID)技术和环境监测传感器于一身,旨在提高仓储操作的自动化和精确度。

嵌入式阿齐Archie 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

java excel导出合并策略

Pollo_的博客 1398

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

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

Java报表导出:基于EasyExcel动态合并单元格的算法与工程实践

在数据处理与报表生成领域,Excel作为广泛使用的办公软件,其单元格合并功能是实现数据结构化、可视化展示的关键技术之一。其原理在于将连续区域内具有相同属性的单元格进行视觉上的整合,以提升报表的可读性和专业性。这项技术的核心价值在于解决了规整的行列数据源与业务所需的、具有层次化视觉归并效果的报表之间的映射矛盾。在Java生态中,Apache POI和EasyExcel是处理Excel文件的主流工具,尤其在海量数据导出场景下,EasyExcel的流式写入模型能有效避免内存溢出(OOM)风险。通过实现自定义的Ce

weixin_32821533的博客 287

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java使用easyexcel导出excel工具类,使用填充模版的方法,实现单元格样式,合并单元格,解决填充行高不一致问题

只写了如何调用,具体根据需求来。

weixin_45559862的博客 441

easyexcel填充方式导出-合并单元格并设置边框

【代码】easyexcel填充方式导出-合并单元并设置边框。

weixin_50520054的博客 452

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

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

张凯强的博客 5303

easyExcel导出表格及合并单元格

easyExcel导出表格及合并单元格 前言 废话不多说,直接上效果图。 效果图 合并之前导出的: 合并之后导出的: 代码的实现主要是合并之后的,为了更好的分清数据之间的关系。 二、代码 目录 <只需要注意红色的> easyExcel依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifac

weixin_45121508的博客 5468

EasyExcel快速入门

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。下面我们直接开始体验Easy Excel的用法格式转换在我们导出Excel时是十分常用的功能。有时候我们对Excel中展示的格式有特殊的需求,且和数据库中不一致,这怎么办呢?修改数据库中的存储类型,全量刷新表?这不用解释,当然是不可接受的。在每次写入Excel之前先手动转换一把格式?功能倒是可以实现,但是太复杂了。其实。

qq_41958629的博客 6009

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填充并合并行

Java基于EasyExcel根据模板生成Excel(涉及合并单元格) https://blog.csdn.net/qq_43457781/article/details/124292163 java-easyExcel导出-合并单元格 https://blog.csdn.net/UID_UUID/article/details/121900818?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~defaul

haiyang4988的博客 2403

easyExcel 导出一对多的数据,合并单元格,亲测可用

/ 主表实体@Data@ExcelProperty("订单ID")@ExcelProperty("客户名称")@ExcelProperty("订单日期")// 一对多关系 - 订单项// 子表实体@Data@ExcelProperty("商品ID")@ExcelProperty("商品名称")@ExcelProperty("数量")@ExcelProperty("单价")// 导出DTO@Data。

yyeare的博客 1098
上一篇: Java-easy Excel监听器
下一篇: easyExcel合并单元格策略
UID_UUID
博客等级 码龄5年 352粉丝 12原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值