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

java实现poi-ooxml导出Excel的功能

文章目录

  • 1. 添加poi-ooxml依赖
  • 2. Excel导出工具类
  • 3.核心逻辑说明
  • 4.扩展建议
  • 5.HSSF、XSSF、SXSSF 的核心原则和场景建议,帮助你在不同需求下快速决策:

以下是一个基于 Apache POI 实现的简单、通用的Java导出Excel工具类,代码逻辑清晰且注释详细,适合快速集成到项目中

1. 添加poi-ooxml依赖

在 pom.xml 中添加 Apache POI 依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>

2. Excel导出工具类

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;/*** Excel导出工具类*/
public class ExcelExporter {/*** 导出数据到Excel文件* @param dataList  数据列表(泛型支持任意对象)* @param headers   表头配置,格式:{ {"列名1", "字段名1"}, {"列名2", "字段名2"} }* @param filePath  导出文件路径(如:/tmp/data.xlsx)*/public static <T> void exportToExcel(List<T> dataList, String[][] headers, String filePath) {try (Workbook workbook = new XSSFWorkbook()) { // 创建Excel工作簿(xlsx格式)Sheet sheet = workbook.createSheet("Sheet1"); // 创建Sheet页// 1. 创建表头行Row headerRow = sheet.createRow(0);for (int i = 0; i < headers.length; i++) {Cell cell = headerRow.createCell(i);cell.setCellValue(headers[i][0]); // 写入列名}// 2. 填充数据行for (int rowIdx = 0; rowIdx < dataList.size(); rowIdx++) {T data = dataList.get(rowIdx);Row dataRow = sheet.createRow(rowIdx + 1); // 数据从第2行开始// 通过反射获取字段值for (int colIdx = 0; colIdx < headers.length; colIdx++) {String fieldName = headers[colIdx][1]; // 获取字段名Object value = getFieldValue(data, fieldName);Cell cell = dataRow.createCell(colIdx);setCellValue(cell, value); // 写入单元格值}}// 3. 自动调整列宽for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}// 4. 写入文件try (FileOutputStream fos = new FileOutputStream(filePath)) {workbook.write(fos);}System.out.println("Excel导出成功,路径:" + filePath);} catch (IOException | ReflectiveOperationException e) {System.err.println("导出Excel失败:" + e.getMessage());}}/*** 通过反射获取对象的字段值*/private static <T> Object getFieldValue(T data, String fieldName) throws NoSuchFieldException, IllegalAccessException {Field field = data.getClass().getDeclaredField(fieldName);field.setAccessible(true); // 允许访问私有字段return field.get(data);}/*** 设置单元格的值(支持String、Number、Boolean类型)*/private static void setCellValue(Cell cell, Object value) {if (value == null) {cell.setCellValue("");} else if (value instanceof Number) {cell.setCellValue(((Number) value).doubleValue());} else if (value instanceof Boolean) {cell.setCellValue((Boolean) value);} else {cell.setCellValue(value.toString());}}
}
import java.util.Arrays;
import java.util.List;public class Main {public static void main(String[] args) {// 模拟数据List<User> userList = Arrays.asList(new User("张三", 25, true),new User("李四", 30, false));// 表头配置:{ "列显示名", "实体类字段名" }String[][] headers = {{"姓名", "name"},{"年龄", "age"},{"是否VIP", "isVip"}};// 导出ExcelExcelExporter.exportToExcel(userList, headers, "users.xlsx");}
}

3.核心逻辑说明

泛型支持:工具类可导出任意对象列表,通过反射动态获取字段值。

表头灵活配置:通过二维数组定义表头显示名和对应字段名。

自动类型处理:支持 String、Number、Boolean 类型字段的自动转换。

资源自动关闭:使用 try-with-resources 确保流正确关闭。

列宽自适应:调用 autoSizeColumn 使列宽适应内容。

4.扩展建议

大数据量优化:若数据量超过万级,建议改用 SXSSFWorkbook(Apache POI流式API)避免内存溢出。

样式定制:可扩展工具类,添加单元格样式(字体、颜色、边框等)。

异常细化:根据业务需求增加更详细的异常处理逻辑。

此实现方案兼顾了简单性和通用性,适合快速集成到Spring Boot、普通Java项目等场景。

5.HSSF、XSSF、SXSSF 的核心原则和场景建议,帮助你在不同需求下快速决策:

< 1万行:任选 HSSF 或 XSSF。需要兼容旧版Office(如2003):选 HSSF。需要现代Excel功能(如更多样式、公式):选 XSSF。1万 ~ 100万行:必须选 SXSSF(避免内存溢出)。> 100万行:SXSSF + 分Sheet存储(单Sheet最多104万行)。小数据、兼容性优先 → HSSF。中小数据、功能丰富 → XSSF。大数据量、内存敏感 → SXSSF。
http://www.xdnf.cn/news/511921.html

相关文章:

  • Graphics——基于.NET 的 CAD 图形预览技术研究与实现——CAD c#二次开发
  • 微软将于 8 月 11 日关闭 Bing Search API 服务
  • 服务器防文件上传手写waf
  • 系统性能不达标,如何提升用户体验?
  • IDEA - Windows IDEA 代码块展开与折叠(基础折叠操作、高级折叠操作)
  • 优先级队列(堆)
  • Vue-计算属性
  • Nordic 的RTC(Real-time counter)的介绍
  • 【GPT入门】第39课 OPENAI官方API调用方法
  • 螺旋矩阵--LeetCode
  • DB-MongoDB-00002--Workload Generator for MongoDB
  • ⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」
  • 【NGINX】 -10 keepalived + nginx + httpd 实现的双机热备+ 负载均衡
  • 【锂电池剩余寿命预测】LSTM长短期记忆神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
  • Nginx配置中include mime.types的作用及正确配置mime类型
  • 【Android】从Choreographer到UI渲染(二)
  • Kotlin Multiplatform--04:经验总结(持续更新)
  • 系统架构设计(十四):解释器风格
  • 论信息系统项目的采购管理
  • 【周输入】510周阅读推荐-3
  • LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution
  • Python编程入门:从安装到基础算法应用的完整指南
  • weibo_comment_pc_tool | 我于2025.5月用python开发的评论采集软件,根据帖子链接爬取评论的界面工具
  • UE5无法编译问题解决
  • 机器学习(13)——LGBM(2)
  • sparkSQL读入csv文件写入mysql(2)
  • 【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等
  • 餐厅等位与核酸检测排队:用算法模拟生活中的等待
  • printf在c语言中代表什么(非常详细)
  • PyTorch音频处理技术及应用研究:从特征提取到相似度分析