当前位置: 首页 > news >正文

多sheet excel 导出

在处理大量数据导出到Excel时,将数据分到多个Sheet后统一导出是一种高效且常见的方法。下面用一个流程图帮你快速了解核心流程,然后再看具体的代码实现。

flowchart TDA[开始导出请求] --> B[计算数据总量与Sheet数量]B --> C[创建ExcelWriter实例]C --> D[循环创建每个Sheet]D --> E{是否还有未处理数据?}E -- 是 --> F[分页查询当前Sheet数据]F --> G[创建WriteSheet并设置名称]G --> H[将数据写入当前Sheet]H --> DE -- 否 --> I[执行excelWriter.finish]I --> J[关闭输出流]J --> K[导出完成]

下面是基于 ​​EasyExcel​​ 库的具体实现方案和代码示例。

📝 核心代码实现

首先,在项目的 pom.xml 文件中添加 EasyExcel 依赖。

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version> <!-- 请使用最新稳定版本 -->
</dependency>

下面是实现分 Sheet 导出的关键代码:

@Service
public class DataExportService {@Autowiredprivate YourMapper yourMapper; // 你的数据访问层/*** 将大数据量分Sheet导出为Excel* @param response HttpServletResponse*/public void exportLargeDataToSheets(HttpServletResponse response) {// 1. 设置响应头,告诉浏览器这是一个Excel文件下载请求response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("UTF-8");String fileName = "大数据导出示例.xlsx";try {fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");} catch (UnsupportedEncodingException e) {e.printStackTrace();}response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName);// 2. 获取数据总量,并计算需要的Sheet数long totalCount = yourMapper.selectCount(null); // 假设的方法,获取总数据量int batchSize = 5000; // 每个Sheet存放的数据行数,可调整int sheetCount = (int) (totalCount / batchSize) + (totalCount % batchSize > 0 ? 1 : 0);// 3. 创建ExcelWriter实例ExcelWriter excelWriter = null;try (OutputStream outputStream = response.getOutputStream()) {excelWriter = EasyExcel.write(outputStream, YourDataModel.class).build(); // YourDataModel是你的数据模型类// 4. 循环创建并写入每个Sheetfor (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++) {// 计算当前页的起始位置long currentPage = sheetIndex + 1;long startRow = sheetIndex * batchSize;// 分页查询数据List<YourDataModel> dataList = yourMapper.selectBatch(startRow, batchSize); // 假设的分页查询方法// 创建WriteSheet,并指定Sheet名称(例如:Sheet1, Sheet2...)WriteSheet writeSheet = EasyExcel.writerSheet(sheetIndex, "数据页_" + (sheetIndex + 1)).build();// 将当前批次的数据写入到对应的Sheet中excelWriter.write(dataList, writeSheet);}} catch (IOException e) {e.printStackTrace();} finally {// 5. 非常重要!最终必须调用finish方法,才会真正写出文件,并关闭相关资源。if (excelWriter != null) {excelWriter.finish();}}}
}

💡 代码要点解析

  • ​数据查询​​:关键在于​​分页查询​​。使用 limit startRow, batchSize 这样的SQL语句,分批从数据库拉取数据,避免一次性加载全部数据导致内存溢出(OOM)。你需要根据使用的持久层框架(如MyBatis)实现对应的分页查询方法。
  • ​Sheet管理​​:通过循环创建多个 WriteSheet 对象,每个对象对应Excel中的一个工作表。writerSheet(sheetIndex, "Sheet名称") 方法用于指定Sheet的索引和名称。
  • ​资源管理​​:ExcelWriterOutputStream 必须正确关闭。在 finally 块中调用 excelWriter.finish() 是确保资源释放和文件正确生成的关键。

🚀 进阶优化建议

当数据量特别大(例如百万行以上)时,可以考虑以下优化方案:

  • ​异步导出​​:对于耗时很长的导出任务,建议采用异步处理。用户触发导出后,服务端生成一个任务ID并立即返回。任务在后台执行,用户可通过任务ID轮询进度或等待完成后下载。
  • ​多线程并行处理​​:如果不同Sheet的数据相互独立,可以使用多线程并行查询和写入,充分利用多核CPU能力。但要注意线程安全和数据库连接池压力。
  • ​限制与压缩​​:Excel单个Sheet最多支持约104万行数据。如果总数据量远超于此,分Sheet是必须的。最终生成的文件如果过大,可以考虑打包成ZIP格式提供下载。

⚠️ 注意事项

  • ​内存监控​​:即使分页查询,也要注意每批数据的大小(batchSize),避免单个批次数据过大。建议根据实际数据行的内存占用来调整 batchSize,通常设置在几千到一万条记录为宜。
  • ​事务与连接​​:长时间执行的导出任务可能会占用数据库连接。确保查询方法的事务传播行为设置正确(例如 @Transactional(readOnly = true, timeout = 60)),避免长时间占用写事务。

希望这份详细的指南和代码示例能帮助你顺利实现需求!如果你在具体实现中遇到其他问题,可以随时提出。

http://www.dtcms.com/a/410624.html

相关文章:

  • 手机移动端网站是什么用什么软件做网站布局
  • cesium-kit:让 Cesium 开发像写 UI 组件一样简单
  • 电子工程师网站wordpress the ken
  • Nginx HTTPS 深入实战 配置、性能与排查全流程(Nginx https
  • 网站建设和优化的营销话术亚马逊雨林生存游戏手机下载
  • 一场“无感换心”手术:金仓数据库如何让电子证照系统平滑告别MongoDB
  • 【开源】基于STM32的新疆地区棉花智能种植系统
  • 高平市规建设局网站短链接生成器
  • 解决SSL握手失败问题:SSLHandshakeException: Received fatal alert: handshake_failure
  • 降级版本Pillow解决freetypefont has no attribute getsize问题
  • 网站设计实例教程wordpress引用文章
  • 基于蜣螂优化的LSTM深度学习网络模型(DBO-LSTM)的一维时间序列预测算法matlab仿真
  • 改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
  • 有什么公司要做推广的网站推广优化软件
  • visual studio 2019配置qt程序
  • 漏标(Missing Mark)问题深度解析
  • OpenAI近日推出了一项名为 ChatGPT Pulse 的全新功能
  • 购物网站后台设计wordpress怎么设置404页面跳转
  • 销售网站免费做珠海品牌型网站建设
  • Lucene 8.7.0 版本中dvd、dvm文件详解
  • Ubuntu 系统上安装 jdk-23_linux-x64_bin.tar.gz
  • o2o网站制作公司广告设计与制作标书
  • 苏州网站推广建设安全达标建设网站
  • 丙烯酸胶粘剂怎么选?先避 3 个坑,再挑靠谱品牌
  • Solidworks练习13-拉伸、拉伸切、筋
  • LeetCode算法日记 - Day 54: 二叉树的所有路径、全排列
  • 人脸模型训练-推理完整过程附代码
  • 洛阳网站排名福州网站建设H5
  • C语言入门教程 | 阶段五:指针与字符串、数组——字符串指针与多级指针
  • 网站已收录的404页面的查询秀山网站建设公司