【Java中导出Excel导出多个sheet页】

news2024/11/18 23:29:33

Java中导出Excel导出多个sheet页

  • 序言
  • 如何处理多个sheet页的导出
  • 期间遇到了一个sheet页相关的问题,以及解决办法
    • 多sheet页导出遇到,第二个sheet页的标题名称会把第一个的覆盖的问题
  • 结语

序言

在日常工作中经常有导出数据文件的需求,避免不了会有导出多个sheet页的功能,这里给大家分享一个自己使用过的方法。

如何处理多个sheet页的导出

下面是导出的方法代码,用到的参数基本就是两个对应的数据集合,两个数据的标题(这个根据自己需求来,可以不用),excel文件名称,以及两个sheet页的名称。
// 这里是导出多个sheet页的方法代码
	/**
		* 导出多个sheet页
		* @param response
		* @param list 第一个sheet页数据集合
		* @param list1 第二个sheet页数据集合
		* @param title 第一个的标题
		* @param title1 第二个的标题
		* @param fileName excel文件名称
		* @param sheetName 第一个sheet页名
		* @param sheetName1 第二个sheet页名
	*/
	public static void exportExcelPlus1(HttpServletResponse response,List<?> list,List<?> list1,String title,String title1,String fileName,String sheetName,String sheetName1){
        if (CollUtil.isEmpty(list)) {
            throw new SystemNoLogException(ResponseCode.EXCEL_EXPORT_FAILED, "无数据可导出");
        }
        Class<?> clazz = list.get(0).getClass();
        Class<?> clazz1 = list1.get(0).getClass();
        if (StrUtil.isEmpty(fileName)) {
            fileName = "Excel导出";
        }
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileSuffix = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
            fileName = fileName.concat("_").concat(fileSuffix);
            String excelName = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
            Field[] fields = clazz.getDeclaredFields();
            List<Field> fieldList = Arrays.stream(fields).filter(item -> item.getAnnotation(ExcelProperty.class) != null).collect(Collectors.toList());
            int cellCount = fieldList.size();

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).excelType(ExcelTypeEnum.XLSX).build();

            WriteSheet mainSheet = EasyExcel.writerSheet(0, sheetName).head(clazz)
                    .registerWriteHandler(new ExportExcelTitleWriteHandler(cellCount, title,0))
                    .registerWriteHandler(new ExportExcelHeadWriteHandler(1))
                    .registerWriteHandler(new HorizontalCellStyleStrategy(defaultHeadStyle(), defaultContentCellStyle()))
                    .sheetName(sheetName)
                    //默认样式
                    .useDefaultStyle(true)
                    //写入头信息的开始行数
                    .relativeHeadRowIndex(1)
                    .build();


            excelWriter.write(list,mainSheet);
            Field[] fields1 = clazz1.getDeclaredFields();
            List<Field> fieldList1 = Arrays.stream(fields1).filter(item -> item.getAnnotation(ExcelProperty.class) != null).collect(Collectors.toList());
            int cellCount1 = fieldList1.size();
            WriteSheet dSheet = EasyExcel.writerSheet(1, sheetName1).head(clazz1)
                    .registerWriteHandler(new ExportExcelTitleWriteHandler(cellCount1, title1,1))
                    .registerWriteHandler(new ExportExcelHeadWriteHandler(1))
                    .registerWriteHandler(new HorizontalCellStyleStrategy(defaultHeadStyle(), defaultContentCellStyle()))
                    .sheetName(sheetName1)
                    //默认样式
                    .useDefaultStyle(true)
                    //写入头信息的开始行数
                    .relativeHeadRowIndex(1)
                    .build();

            excelWriter.write(list1,dSheet);
            excelWriter.finish();

        } catch (Exception e) {
            log.error("export excel error", e);
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");

            try {
                String message = "下载文件失败" + e.getMessage();
                RestResponse restResponse = RestResponse.build(ResponseCode.EXCEL_EXPORT_FAILED, message);
                response.getWriter().println(JSON.toJSONString(restResponse));
            } catch (IOException ioException) {
                log.error("export excel error", ioException);
                throw new SystemNoLogException(ResponseCode.EXCEL_EXPORT_FAILED, ioException.getMessage());
            }
        }
    }

期间遇到了一个sheet页相关的问题,以及解决办法

多sheet页导出遇到,第二个sheet页的标题名称会把第一个的覆盖的问题

 导出数据之后发现,第二个的标题名称覆盖了第一个的标题,去网上找到了对应的解决办法,就是给标题赋值的时候,后面加上对应的sheet页索引,这样就能指定每一个sheet页对应的标题名称,下图中红色框中最后的索引就对应了各自的sheet页,索引从0开始,大家可以根据自己需求更改。

多sheet页相关问题

结语

不是职业博主,只是记录自己用到的一些技术点或者问题相关的解决办法,以便于以后用到的时候查看,顺便分享,如果有无法解决问题可以留言,看到会及时回复。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云鲲鹏架构docker部署2048小游戏

华为云鲲鹏架构docker部署2048小游戏 1. 鲲鹏架构ESC2. 配置docker3. 上传2048镜像4. 删除容器,镜像 1. 鲲鹏架构ESC 2. 配置docker 安装dockeryum -y install docker开机启动 systemctl enable docker启动docker服务 systemctl start docker查询docker的运行版本 docker -v3…

嵌入式linux系统中面试过程经验分享

大家好,今天主要给分享一下,如何在面试中介绍自己的项目经验,希望对大家有所帮助。 在面试时,经过寒暄后,一般面试官会让介绍项目经验。常见的问法是,说下你最近的(或最拿得出手的)一个项目。 根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚…

【python】PyQt5信号与槽原理剖析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

大模型+多模态合规分析平台,筑牢金融服务安全屏障

随着金融市场的快速发展&#xff0c;金融产品和服务日趋多样化&#xff0c;消费者面临的风险也逐渐增加。 为保护消费者权益&#xff0c;促进金融市场长期健康稳定发展&#xff0c;国家监管机构不断加强金融监管&#xff0c;出台了一系列法律法规和政策文件。对于金融从业机构…

基于YOLOv5s的纸板缺陷检测(附数据集与Coovally操作步骤)

本文内容:以纸板缺陷检测为例操作的整个过程&#xff0c;从创建数据集到训练模型再到预测结果每个步骤进行可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 物流行业快速发展&#xff0c;对于网购的需求不断增大&#xff0c;随之而来的就是纸板制造…

Linux安装JDk教程

&#x1f4d6;Linux安装JDk教程 ✅下载✅安装 ✅下载 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 123云盘&#xff1a;https://www.123pan.com/s/4brbVv-JdmWA.html ✅安装 1.上传安装包jdk-17_linux-x64_bin.tar.gz到指定位…

记一次elementui时间线的实现

实现效果 点击展开&#xff0c;每次累加五条数据进行展示 实现思路 起始本质上就是一个分页查询&#xff0c;只不过按新的形式展示&#xff0c;然后也不统计总数&#xff0c;每次只展示固定的5条数据点击加载更多&#xff0c;就展示下一页&#xff0c;页的页数进行1&#xff…

树莓派pico入坑笔记,uart使用

uart原理自行百度&#xff0c;相关内容很多其他博主写过并且质量很高&#xff0c;这里不再赘述。 调用circuitpy的busio模块来使用uart&#xff0c;除此以外&#xff0c;spi、iic等要需要使用该模块&#xff0c;使用方法见 官方教程 &#xff0c;详细信息见文档 官方的例子简…

Mysql索引的实现原理,B+Tree,WAL

InnoDB 引擎&#xff0c;每一个数据表有两个文件 .frm和.ibd&#xff0c;分别为表结构&#xff0c;数据和索引&#xff0c;数据挂在主索引的叶子节点上&#xff0c;此主索引称为聚簇索引。 MyISAM 引擎&#xff0c;每一个数据表有三个文件.frm和.MYI和.MYD&#xff0c;分别为表…

Docker-compose 实现Prometheus+Grafana监控MySQL及Linux主机

. ├── Grafana │ ├── data │ └── docker-compose.yaml ├── Mysql │ ├── conf │ ├── data │ ├── docker-compose.yaml │ └── logs ├── Mysqld_exporter │ ├── conf │ └── docker-compose.yaml ├── node-exporter │…

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

golang——Gin框架及路由介绍

一. 框架介绍 Gin是一个轻量级的Go语言Web框架&#xff0c;它具有高性能和简洁的设计。由于其快速的路由匹配和处理性能&#xff0c;Gin成为Go语言中最受欢迎的Web框架之一。 特点&#xff1a; 快速和轻量&#xff1a;Gin框架的设计注重性能和效率&#xff0c;采用了一些优化措…

暗黑4PTR怎么参与测试 暗黑4第五赛季怎么参加PTR测试教程

暗黑破坏神4作为暗黑破坏神系列的最新作品&#xff0c;自从2023年上线就受到了一众好评。游戏是动作冒险类角色扮演游戏&#xff0c;游戏的背景设定在一个腐化的圣休瑞亚大陆上&#xff0c;玩家们可以五种职业中选择自己喜爱的游戏进行游戏。 暗黑破坏神4第五赛季现在已经开启P…

时序约束(一):时钟的约束

目录 一、时钟约束的目的 二、约束工程项目 三、主时钟和生成时钟 四、主时钟约束 五、生成钟约束 一、时钟约束的目的 之前的文章对时序分析的基本原理做了介绍&#xff0c;我们会发现时序分析离不开时钟信号。对于时序分析工具来说同样如此&#xff0c;分析工具需要我…

谈谈你对AQS的理解

AQS概述 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中一个核心的框架&#xff0c;主要用于构建阻塞式锁和相关的同步器&#xff0c;也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIF…

《mysql》--mysql约束

数据库约束 有的时候数据库中的数据是有一定要求的&#xff0c;有些数据认为是合法数据&#xff0c;有些是非法数据&#xff0c;如果靠人工检查显然是不靠谱的&#xff1b; 数据库会自动的对数据的合法性进行校验检查目的就是&#xff0c;保证数据中能够避免被插入/修改一些非…

刷盘,还是不刷盘,是一个问题 | 架构师之路重启

前几个有个朋友留言&#xff0c;问我说最近两年公号发读书感悟&#xff0c;职场感悟&#xff0c;AI实践居多了&#xff0c;发架构思路类的内容少了。 最近准备重启架构思路类的内容&#xff0c;且会保持一如既往的风格&#xff1a; 1. 希望引发大家思考&#xff0c;多讨论&…

docker安装与入门使用(适用于小白)

总结&#xff1a;Docker 是一个开源的容器化平台&#xff0c;旨在使开发、部署和运行应用程序的过程更加简单和高效。Docker 使用操作系统级虚拟化在单个主机上运行多个独立的容器。每个容器包含应用程序及其所有依赖项&#xff0c;确保在不同环境中具有一致的运行表现。 下面…

贪心算法——加工木棍(C++)

上大学&#xff0c;一天是一天&#xff0c;两天也是一天。 ——2024年6月27日 之前考试周断更了&#xff0c;今天重新开始&#xff01; 题目描述 有n根木棍&#xff0c;已知每根木棍的长度和重量。这些木棍在木工机器上加工&#xff0c;机器准备加工木棍需要一些时间&#xf…

ABB机器人示教器死机时如何重置?

ABB机器人示教器死机时如何重置&#xff1f; 若遇到机器人示教器死机或卡顿现象时&#xff0c;可尝试将示教器重置&#xff0c;具体方法可参考以下内容&#xff1a; 如下图所示&#xff0c;首先将机器人控制柜断电关机&#xff0c; 如下图所示&#xff0c;同时按住快捷键&…