excel导出并合并

普通导出数据

需求

需要将相同列数据合并

效果图:

代码:

package cn.silence.test;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 班级信息
 */
@Data
@AllArgsConstructor
public class ClassInfo {
    /**
     * 学院
     */
    private String academy;
    /**
     * 系
     */
    private String system;
    /**
     * 专业
     */
    private  String specialized;
    /**
     * 班级
     */
    private String className;
}

package cn.silence.test;

import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicInteger;

public class Excel {

    public static void main(String[] args) {
        //读取数据 并根据需求排序
        TreeSet<ClassInfo> set = getClassInfos();

        //excel写出位置
        File file = new File("C:\\Users\\Administrator\\Desktop\\777.xlsx");
        BigExcelWriter writer = ExcelUtil.getBigWriter(file);

        //定义需要合并的列===========================================
        ClassInfo first = set.first();
        //学院
        String academy = first.getAcademy();
        AtomicInteger academyIndex = new AtomicInteger(1);
        //系
        String system = first.getSystem();
        AtomicInteger systemIndex = new AtomicInteger(1);
        //专业
        String specialized = first.getSpecialized();
        AtomicInteger specializedIndex = new AtomicInteger(1);

        //根据条件合并,出现不同的字段名称,则将该行号与之前的行号之间的行合并。
        AtomicInteger count = new AtomicInteger(1);
        for (ClassInfo classInfo : set) {
            academy = marge(academy, classInfo.getAcademy(), academyIndex, count, writer, 0);
            system = marge(system, classInfo.getSystem(), systemIndex, count, writer, 1);
            specialized = marge(specialized, classInfo.getSpecialized(), specializedIndex, count, writer, 2);
            count.incrementAndGet();
        }

        //结尾合并
        count.decrementAndGet();
        endMarge(academyIndex.get(), count.get(), 0, academy, writer);
        endMarge(systemIndex.get(), count.get(), 0, system, writer);
        endMarge(specializedIndex.get(), count.get(), 0, specialized, writer);

        //write
        writer.setColumnWidth(-1, 40);
        writer.write(set);
        writer.flush();
        writer.close();
    }

    /**
     * 尾行合并
     */
    private static void endMarge(int startIndex, int endIndex, int row, String title, BigExcelWriter writer) {
        if ((startIndex == endIndex) || (startIndex > endIndex)) {
            return;
        }
        writer.merge(startIndex, endIndex, row, row, title, true);
    }

    /**
     * 判断是否需要合并
     */
    private static String marge(String oldValue, String newValue, AtomicInteger index, AtomicInteger count, BigExcelWriter writer, int row) {
        if (StrUtil.equals(oldValue, newValue)) {
            return oldValue;
        }
        int endIndex = count.get() - 1;
        if (index.get() == endIndex) {
            index.incrementAndGet();
            return newValue;
        }
        writer.merge(index.get(), endIndex, row, row, oldValue, true);
        index.set(endIndex);
        index.incrementAndGet();
        return newValue;
    }

    /**
     * 生成测试数据
     */
    @NotNull
    private static TreeSet<ClassInfo> getClassInfos() {
        TreeSet<ClassInfo> set = new TreeSet<>((o1, o2) -> {
            int compareAcademy = o1.getAcademy().compareTo(o2.getAcademy());
            if (compareAcademy != 0) return compareAcademy;

            int compareSystem = o1.getSystem().compareTo(o2.getSystem());
            if (compareSystem != 0) return compareSystem;

            int compareSpecialized = o1.getSpecialized().compareTo(o2.getSpecialized());
            if (compareSpecialized != 0) return compareSpecialized;

            return o1.getClassName().compareTo(o2.getClassName());
        });
        set.add(new ClassInfo("绘画艺术学院", "油画系", "油画", "1班"));
        set.add(new ClassInfo("绘画艺术学院", "油画系", "油画", "2班"));
        set.add(new ClassInfo("工业设计学院", "直属学院", "产品设计", "20产品甲"));
        set.add(new ClassInfo("绘画艺术学院", "油画系", "油画", "3班"));
        set.add(new ClassInfo("工业设计学院", "直属学院", "产品设计", "21产品乙"));
        set.add(new ClassInfo("绘画艺术学院", "壁画系", "壁画", "4班"));
        set.add(new ClassInfo("绘画艺术学院", "版画系", "版画", "4班"));
        set.add(new ClassInfo("绘画艺术学院", "壁画系", "壁画", "4班"));
        set.add(new ClassInfo("绘画艺术学院", "-", "美术学(硕士)", "-"));
        set.add(new ClassInfo("绘画艺术学院", "版画系", "版画", "4班"));
        set.add(new ClassInfo("绘画艺术学院", "-", "美术(硕士)", "-"));
        set.add(new ClassInfo("工业设计学院", "直属学院", "产品设计", "20产品丁"));
        set.add(new ClassInfo("绘画艺术学院", "油画系", "油画", "4班"));
        set.add(new ClassInfo("时尚设计学院", "服装设计系", "服装与服饰设计(服装设计)", "21服装乙"));
        set.add(new ClassInfo("时尚设计学院", "服装设计系", "服装与服饰设计(服装设计)", "20服装甲"));
        set.add(new ClassInfo("时尚设计学院", "服装设计系", "服装与服饰设计(服装设计)", "22时尚设计4班"));
        set.add(new ClassInfo("时尚设计学院", "服装设计系", "服装与服饰设计(染织设计)", "21染织"));
        set.add(new ClassInfo("时尚设计学院", "服装设计系", "服装与服饰设计(染织设计)", "20染织"));
        return set;
    }
}

       <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.15</version>
        </dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/555570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony多媒体-ijkplayer

简介 ijkplayer是OpenHarmony环境下可用的一款基于FFmpeg的视频播放器。 演示 编译运行 1、通过IDE工具下载依赖SDK&#xff0c;Tools->SDK Manager->OpenHarmony SDK 把native选项勾上下载&#xff0c;API版本>9 2、开发板选择RK3568&#xff0c;ROM下载地址. 选择…

直流无刷散热风扇的知识原理与内部构成

①直流无刷风扇的结构&#xff1a;主要可分为转子、定子、外框、电机(马达)这四个主要部分以及一些其它的零碎的部件 第一&#xff0c;风扇转子部分: 包括风扇扇叶&#xff0c;是产生空气流动的核心、散热风扇的轴心&#xff0c;用来支撑平衡扇叶滚动、转子磁环&#xff0c;永…

Python路面车道线识别偏离预警

程序示例精选 Python路面车道线识别偏离预警 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python路面车道线识别偏离预警》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

Spring Boot + 事务钩子函数,打造高效支付系统!

今天&#xff0c;我继续安利一个独门绝技&#xff1a;Spring 事务的钩子函数。 单纯的讲技术可能比较枯燥乏味。 接下来&#xff0c;我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。 一、案例背景 拿支付系统相关的业务来举例。在支付系统中&#xff0c;我们…

Nodejs 第六十四章(SSO单点登录)

单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份认证和访问控制的机制&#xff0c;允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录到多个应用程序或系统&#xff0c;而无需为每个应用程序单独提供凭据 SSO的主要优…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘&#xff0c;备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

【Keil MDK5新建工程】STM32F103C8T6

一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 四、GPIO模式 一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 工程文件夹里建立Core、Library、User等文件夹…

2024年华中杯数学建模竞赛ABC题思路分析

简单分析一下各个题目可能需要用到的方法和模型&#xff0c;完整代码和成品论文见文末 A题 太阳能路灯光伏板的朝向设计问题: 1. 球面几何、天文学相关知识,如赤纬角、太阳高度角、时角等概念和公式 2. 太阳辐射模型,根据太阳能辐射强度、大气衰减系数等计算地表太阳辐射强度…

绝对隔离+底层限制,成就猎鹰蜜罐“牢不可破”的立体化安全

前言 自网络诞生以来&#xff0c;攻击威胁事件层出不穷&#xff0c;网络攻防对抗已成为信息时代背景下的无硝烟战争。然而&#xff0c;传统的网络防御技术如防火墙、入侵检测技术等都是一种敌暗我明的被动防御&#xff0c;难以有效应对攻击者随时随地发起的无处不在的攻击和威胁…

【学习笔记】Vue3源码解析:第五部分 - 实现渲染(1)

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第五部分-&#xff1a;&#xff08;对应课程的第29-32节&#xff09; 第29节&#xff1a;《实现渲染的createRender方法》 1、通过createApp()方法得到一个…

AI热潮下,公链基础设施赛道都有哪些变化?

最近在一级市场&#xff0c;最火热的赛道无疑是AI&#xff0c;其次是BTC&#xff0c;每天聊的项目80%都集中在这两个赛道&#xff0c;我个人最多的时候一天可以聊5&#xff0c;6个AI项目。 可以预见的是AI泡沫会在明后年达到顶峰&#xff0c;随着数以百计的AI新项目上线&#…

QT实现客户端断开连接

Widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false); //不可用ui-…

SQL Server Management Studio 显示行号

前言 在使用 SQL Server Management Studio (SSMS) 进行数据库管理和查询时&#xff0c;能够看到代码的行号是非常有用的。这可以帮助您更容易地定位代码错误、讨论特定的代码行&#xff0c;或者在执行长查询时快速找到特定行。在本文中&#xff0c;我将向您展示如何在 SSMS 中…

AIDE:自动驾驶目标检测的自动数据引擎

AIDE&#xff1a;自动驾驶目标检测的自动数据引擎 摘要IntroductionRelated WorksMethodData FeederModel Updater4 Experiments 摘要 自动驾驶车辆&#xff08;AV&#xff09;系统依赖于健壮的感知模型作为安全保证的基石。然而&#xff0c;道路上遇到的物体表现出长尾分布&a…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识&#x1f917; 以下内容来自于李宏…

vue3+elment复杂详情页面打开后,再打开其他页面都显示空白,控制台也没什么特殊报错

页面使用了el-tabs 、 el-tab-pane、el-table 等标签 但是经测试不是这些问题导致的 js也使用了onMounted &#xff0c;但是除掉也时空白页面 反正之前人写的页面可乱&#xff0c;尤其是js这块&#xff0c;穿插引用import一大堆 主题页面样式布局如下 最后看到页面代码太乱…

古籍数字化平台:精校功能介绍

一、平台介绍 古籍数字化平台&#xff0c;本着公益性、低成本、合作共赢的三大原则&#xff0c;功能涵盖古籍OCR识别、族谱县志OCR识别、民国报纸OCR识别、图文逐字校对、数据著录、智能标点分段、精编排版、智能白话译文等&#xff0c;是一站式线上整理全流程平台。 平台集成…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

2024年免费云服务器推荐,小编亲测好用!

随着云计算技术的飞速发展&#xff0c;云服务器以其弹性、高效、安全的特性&#xff0c;成为众多企业和个人用户的首选。尽管市面上有众多收费的云服务器产品&#xff0c;但免费的云服务器仍然吸引着大量用户&#xff0c;尤其是初学者和预算有限的用户。下面&#xff0c;我们就…

从API到Agent:洞悉LangChain工程化设计

作者&#xff1a;范志东 原文&#xff1a;https://mp.weixin.qq.com/s/zGS9N92R6dsc9Jk57pmYSg 本文作者试着从工程角度去理解LangChain的设计和使用。大家可以将此文档作为LangChain的“10分钟快速上手”手册&#xff0c;希望帮助需要的同学实现AI工程的Bootstrap。 我想做一…