在 Java 中导出包含多个 Sheet 的 Excel 文件,可以使用 Apache POIEasyExcel(阿里开源库)。以下是两种方法的详细实现:


方法 1:使用 Apache POI(支持 .xls 和 .xlsx)

1. 添加 Maven 依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version> <!-- 处理 .xls -->
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version> <!-- 处理 .xlsx -->
</dependency>

2. 完整代码示例

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;public class MultiSheetExcelExport {public static void main(String[] args) {// 1. 创建工作簿(.xlsx 格式)Workbook workbook = new XSSFWorkbook();// 2. 创建第一个 Sheet(学生信息)Sheet studentSheet = workbook.createSheet("学生表");// 添加表头Row headerRow = studentSheet.createRow(0);headerRow.createCell(0).setCellValue("学号");headerRow.createCell(1).setCellValue("姓名");headerRow.createCell(2).setCellValue("成绩");// 添加数据addStudentData(studentSheet);// 3. 创建第二个 Sheet(课程信息)Sheet courseSheet = workbook.createSheet("课程表");// 添加表头Row courseHeader = courseSheet.createRow(0);courseHeader.createCell(0).setCellValue("课程ID");courseHeader.createCell(1).setCellValue("课程名称");// 添加数据addCourseData(courseSheet);// 4. 导出到文件try (FileOutputStream fos = new FileOutputStream("multi_sheet_example.xlsx")) {workbook.write(fos);System.out.println("Excel 导出成功!");} catch (IOException e) {e.printStackTrace();} finally {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}}private static void addStudentData(Sheet sheet) {Object[][] studentData = {{1001, "张三", 85},{1002, "李四", 92},{1003, "王五", 78}};for (int i = 0; i < studentData.length; i++) {Row row = sheet.createRow(i + 1);for (int j = 0; j < studentData[i].length; j++) {Cell cell = row.createCell(j);if (studentData[i][j] instanceof String) {cell.setCellValue((String) studentData[i][j]);} else if (studentData[i][j] instanceof Integer) {cell.setCellValue((Integer) studentData[i][j]);}}}}private static void addCourseData(Sheet sheet) {Object[][] courseData = {{"C001", "高等数学"},{"C002", "大学英语"},{"C003", "计算机基础"}};for (int i = 0; i < courseData.length; i++) {Row row = sheet.createRow(i + 1);for (int j = 0; j < courseData[i].length; j++) {row.createCell(j).setCellValue(courseData[i][j].toString());}}}
}

方法 2:使用 EasyExcel(推荐大数据量导出)

1. 添加 Maven 依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>

2. 定义数据模型

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class Student {@ExcelProperty("学号")private Integer id;@ExcelProperty("姓名")private String name;@ExcelProperty("成绩")private Integer score;
}@Data
public class Course {@ExcelProperty("课程ID")private String courseId;@ExcelProperty("课程名称")private String courseName;
}

3. 多 Sheet 导出实现

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.util.ArrayList;
import java.util.List;public class EasyExcelMultiSheetExport {public static void main(String[] args) {// 1. 准备数据List<Student> students = new ArrayList<>();students.add(new Student(1001, "张三", 85));students.add(new Student(1002, "李四", 92));List<Course> courses = new ArrayList<>();courses.add(new Course("C001", "高等数学"));courses.add(new Course("C002", "大学英语"));// 2. 导出到ExcelString fileName = "multi_sheet_easyexcel.xlsx";try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {// 第一个Sheet:学生数据WriteSheet studentSheet = EasyExcel.writerSheet(0, "学生信息").head(Student.class).build();excelWriter.write(students, studentSheet);// 第二个Sheet:课程数据WriteSheet courseSheet = EasyExcel.writerSheet(1, "课程信息").head(Course.class).build();excelWriter.write(courses, courseSheet);}System.out.println("EasyExcel 导出成功!");}
}

两种方法对比

特性Apache POIEasyExcel
适用场景需要精细控制Excel样式和功能大数据量导出(百万行级)
内存占用较高(全内存操作)低(流式写入)
API复杂度较复杂简单易用
性能处理小文件快处理大文件性能优异
功能支持所有Excel特性专注数据导出,样式支持有限

最佳实践建议

  1. 小数据量+复杂样式 → 选择 Apache POI
  2. 大数据量导出 → 选择 EasyExcel
  3. 需要兼容旧版Excel(.xls) → 使用 POI 的 HSSFWorkbook

两种方式均可实现多Sheet导出,根据项目需求选择即可!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OneCode采用虚拟DOM结构实现服务端渲染的技术实践

一、技术背景与挑战 随着企业级应用复杂度的提升&#xff0c;传统服务端渲染(SSR)面临页面交互性不足的问题&#xff0c;而纯前端SPA架构则存在首屏加载慢和SEO不友好的缺陷。OneCode框架创新性地将虚拟DOM技术引入服务端渲染流程&#xff0c;构建了一套兼顾性能与开发效率的企…

变幻莫测:CoreData 中 Transformable 类型面面俱到(八)

概述 各位似秃似不秃小码农们都知道&#xff0c;在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过&#xff0c;大家是否知道在 CoreData 中还存在一个 Transfo…

汽车LIN总线通讯:从物理层到协议栈的深度解析

目录一、物理层&#xff1a;单线传输的信号奥秘1.1 电平定义与信号传输1.2 关键硬件组件作用二、数据链路层&#xff1a;帧结构与通信协议2.1 LIN帧的组成与功能2.2 主从式通信机制三、波特率同步&#xff1a;从节点的时钟校准原理四、软件实现&#xff1a;基于S32K144的主节点…

马尔可夫链:随机过程的记忆法则与演化密码

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 一、核心定义&#xff1a;无记忆的随机演化 马尔可夫链&#xff08;M…

【vue3+tauri+rust】如何实现下载文件mac+windows

项目背景&#xff1a;【vue3taurirust】 由于Safari对于下载总是有诸多阻拦&#xff0c;目前需求windowsmac可以实现&#xff1a; 后端返回的url文件可以下载;前端根据dom元素生成的PDF报告可以下载&#xff08;无远程URL&#xff09;&#xff1b; 我的尝试&#xff1a; 方法…

SQL 快速参考手册-SQL001

SQL 快速参考手册&#xff1a; 为方便快速学习和实践&#xff0c;提供了一份 SQL 快速参考手册&#xff0c;您可以打印出来随时查看&#xff0c;了解常见 SQL 命令的语法和用法。 SQL 数据类型 SQL 数据类型根据不同的数据库系统&#xff08;如 Microsoft Access、MySQL、SQL…

学习java集合

集合与数组的对比集合的长度可变, 数组的长度不可变集合实际上跟数组一样, 是一种容器, 可以存放数据数组可以直接存放基本数据类型和引用数据类型集合可以存放引用数据类型, 但是不能直接存放基本数据类型, 如果要存放基本数据类型, 需要变成一个包装类才行泛型: 限定集合中存…

python训练day49 CBAM

import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio16):"""通道注意力机制初始化参数:in_channels: 输入特征图的通道数ratio: 降维比例&#xff0c;用于减少参数量&#xff0c;默认…

在小程序中实现实时聊天:WebSocket最佳实践

前言 在当今互联网应用中&#xff0c;实时通信已经成为一个标配功能&#xff0c;特别是对于需要即时响应的场景&#xff0c;如在线客服、咨询系统等。本文将分享如何在小程序中实现一个高效稳定的WebSocket连接&#xff0c;以及如何处理断线重连、消息发送与接收等常见问题。 W…

Python网络爬虫编程新手篇

网络爬虫是一种自动抓取互联网信息的脚本程序&#xff0c;广泛应用于搜索引擎、数据分析和内容聚合。这次我将带大家使用Python快速构建一个基础爬虫&#xff0c;为什么使用python做爬虫&#xff1f;主要就是支持的库很多&#xff0c;而且同类型查询文档多&#xff0c;在同等情…

LeetCode.283移动零

题目链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行…

2025年7月4日漏洞文字版表述一句话版本(漏洞危害以及修复建议),通常用于漏洞通报中简洁干练【持续更新中】,漏洞通报中对于各类漏洞及修复指南

漏洞及修复指南 一、暗链 危害&#xff1a;攻击者通过技术手段在用户网页中插入隐藏链接或代码&#xff0c;并指向恶意网站&#xff0c;可导致用户信息泄露、系统感染病毒&#xff0c;用户访问被劫持至恶意网站&#xff0c;泄露隐私或感染恶意软件&#xff0c;被黑客利用进行…

python --飞浆离线ocr使用/paddleocr

依赖 # python3.7.3 paddleocr2.7.0.2 paddlepaddle2.5.2 loguru0.7.3from paddleocr import PaddleOCR import cv2 import numpy as npif __name__ __main__:OCR PaddleOCR(use_doc_orientation_classifyFalse, # 检测文档方向use_doc_unwarpingFalse, # 矫正扭曲文档use…

数据结构与算法:贪心(三)

前言 感觉开始打cf了以后贪心的能力有了明显的提升,让我们谢谢cf的感觉场。 一、跳跃游戏 II class Solution { public:int jump(vector<int>& nums) {int n=nums.size();//怎么感觉这个题也在洛谷上刷过(?)int cur=0;//当前步最远位置int next=0;//多跳一步最远…

【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

Docker 实践与应用案例

引言 在当今的软件开发和部署领域&#xff0c;高效、可移植且一致的环境搭建与应用部署是至关重要的。Docker 作为一款轻量级的容器化技术&#xff0c;为解决这些问题提供了卓越的方案。Docker 通过容器化的方式&#xff0c;将应用及其依赖项打包成一个独立的容器&#xff0c;…

《论三生原理》以非共识路径实现技术代际跃迁‌?

AI辅助创作&#xff1a; 《论三生原理》以颠覆传统数学范式的非共识路径驱动多重技术代际跃迁&#xff0c;其突破性实践与争议并存&#xff0c;核心论证如下&#xff1a; 一、技术代际跃迁的实证突破‌ ‌芯片架构革新‌ 为华为三进制逻辑门芯片提供理论支撑&#xff0c;通过对…

一体机电脑为何热度持续上升?消费者更看重哪些功能?

一体机电脑&#xff08;AIO&#xff0c;All-in-One&#xff09;将主机硬件与显示器集成于单一机身。通常仅需连接电源线&#xff0c;配备无线键盘、鼠标即可启用。相比传统台式电脑和笔记本电脑&#xff0c;选购一体机的客户更看重一体机的以下特点。 一体机凭借其节省空间、简…

无人机载重模块技术要点分析

一、技术要点 1. 结构设计创新 双电机卷扬系统&#xff1a;采用主电机&#xff08;张力控制&#xff09;和副电机&#xff08;卷扬控制&#xff09;协同工作&#xff0c;解决绳索缠绕问题&#xff0c;支持30米绳长1.2m/s高速收放&#xff0c;重载稳定性提升。 轴双桨布局…

【大模型推理】工作负载的弹性伸缩

基于Knative的LLM推理场景弹性伸缩方案 1.QPS 不是一个好的 pod autoscaling indicator 在LLM推理中&#xff0c; 为什么 2. concurrency适用于单次请求资源消耗大且处理时间长的业务&#xff0c;而rps则适合较短处理时间的业务。 3.“反向弹性伸缩”的概念 4。 区分两种不同的…