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.mzph.cn/diannao/83776.shtml

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

相关文章

Nginx端口telnet不通排查指南

nginx已经配置server及端口20002&#xff0c;telnet不通&#xff1a;telnet 127.0.0.1 20002 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused 一、检查 systemctl status nginx.service nginx: [emerg] bind() to 0.0.0.0:20002 failed (13…

【RabbitMQ】消息丢失问题排查与解决

RabbitMQ 消息丢失是一个常见的问题&#xff0c;可能发生在消息的生产、传输、消费或 Broker 端等多个环节。消息丢失的常见原因及对应的解决方案&#xff1a; 一、消息丢失的常见原因 1. 生产端&#xff08;Producer&#xff09;原因 (1) 消息未持久化 原因&#xff1a;生产…

docker默认存储迁移

在容器化场景下默认存储路径为&#xff08;/var/lib/docker&#xff09;大多数平台根目录不支持系统盘扩容&#xff0c;会有空间不足风险隐患&#xff0c;因未配置持久化存储导致容器数据丢失。以迁移Docker存储路径至大容量/data目录说明 一、停止容器 systemctl stop docke…

【Golang笔记02】函数、方法、泛型、接口学习笔记

Golang笔记02&#xff1a;函数、方法、泛型、接口学习笔记 一、进阶学习 1.1、函数 go中的函数使用func关键字进行定义&#xff0c;go程序的入口函数叫做&#xff1a;main&#xff0c;并且必须是属于main包里面。 1.1.1、定义函数 &#xff08;1&#xff09;普通函数 go中…

LLM笔记(九)KV缓存调研

KV 缓存 (Key-Value Cache) 技术详解 KV 缓存&#xff08;Key-Value Cache&#xff09;是在 Transformer 模型&#xff08;尤其是 Decoder-Only 架构或 Encoder-Decoder 架构的 Decoder 部分&#xff09;进行自回归 (auto-regressive) 推理生成序列时&#xff0c;一种至关重要…

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…

LeetCode 热题 100 1.两数之和

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路一暴力遍历&#xff1a; 代码&#xff1a; 暴力遍历Java代码&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 1. 两数之和 - 力扣&#xff08;LeetC…

基于LSTM-GARCH混合模型的黄金价格波动率预测:信用降级事件冲击评估

摘要&#xff1a;本文构建多维度量化分析框架&#xff0c;对近期黄金市场波动进行技术解构。通过主权信用评级调整、地缘风险及宏观经济数据等公开信息源&#xff0c;运用统计学习模型解析市场驱动因素&#xff0c;避免主观预判。文中所有技术分析均基于历史数据回测&#xff0…

分布式与集群:概念、区别与协同

分布式与集群:概念、区别与协同 在分布式系统与云计算领域,分布式(Distributed)和集群(Cluster)是两个高频出现的核心概念。它们常被混淆,但本质上属于不同维度的设计思想。本文将从定义、分类、实际应用及协同关系四个层面,结合 Dubbo、Git、Hadoop 等典型案例,系统…

Prometheus实战教程:k8s平台-Mysql监控案例

配置文件优化后的 Prometheus 自动发现 MySQL 实例的完整 YAML 文件。该配置包括&#xff1a; MySQL Exporter 部署&#xff1a;使用 ConfigMap 提供 MySQL 连接信息。Prometheus 自动发现&#xff1a;通过 Kubernetes 服务发现自动抓取 MySQL 实例。 1、mysql 配置文件 &…

基于区块链技术的智能汽车诊断与性能分析

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…

文字溢出省略号显示

一、 单行文字溢出、省略号显示 二、 多行文字溢出&#xff0c;省略号显示 有较大的兼容性问题&#xff0c;适用于Webkit为内核的浏览器软件&#xff0c;或者移动端的&#xff08;大部分也是webkit&#xff09; 此效果建议后端人员开发 三、图片底侧空白缝隙的修复技巧&#…

JavaScript 中使用 Elasticsearch 的正确方式,第一部分

作者&#xff1a;来自 Elastic Jeffrey Rengifo 讲解如何用 JavaScript 创建一个可用于生产环境的 Elasticsearch 后端。 想获得 Elastic 认证&#xff1f;看看下一期 Elasticsearch 工程师培训什么时候开始吧&#xff01; Elasticsearch 拥有大量新功能&#xff0c;能帮助你…

RAG-MCP:突破大模型工具调用瓶颈,告别Prompt膨胀

大语言模型&#xff08;LLM&#xff09;的浪潮正席卷全球&#xff0c;其强大的自然语言理解、生成和推理能力&#xff0c;为各行各业带来了前所未有的机遇。然而&#xff0c;正如我们在之前的探讨中多次提及&#xff0c;LLM并非万能。它们受限于训练数据的时效性和范围&#xf…

鸿蒙OSUniApp制作一个小巧的图片浏览器#三方框架 #Uniapp

利用UniApp制作一个小巧的图片浏览器 最近接了个需求&#xff0c;要求做一个轻量级的图片浏览工具&#xff0c;考虑到多端适配的问题&#xff0c;果断选择了UniApp作为开发框架。本文记录了我从0到1的开发过程&#xff0c;希望能给有类似需求的小伙伴一些参考。 前言 移动互联…

Python爬虫实战:获取taobao网最新rtx5060ti显卡销量数据并分析,为消费者做参考

一、系统定义与技术架构 1.1 系统定义 本系统是基于 Python 开发的电商数据采集与分析工具,旨在通过模拟用户行为实现淘宝平台 50 系列显卡(以 RTX 5060 Ti 为例)销售数据的自动化获取、清洗、分析及可视化。核心功能包括: 自动登录:通过 Selenium 模拟浏览器操作完成账…

OCframework编译Swift

建一个OC的framework&#xff1a; 需要对外暴露的OC文件&#xff0c;需要放到OC的.h文件中 framework中&#xff0c;OC类&#xff0c;调用framework中的Swift类&#xff1a; #import "WowAudioFocus/WowAudioFocus-Swift.h" //02 #import "{工程名}/{工程…

每日算法 -【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进

【Swift 算法】Two Sum 问题&#xff1a;从暴力解法到最优解法的演进 本文通过“Two Sum”问题&#xff0c;带你了解如何从最直观的暴力解法&#xff0c;逐步优化到高效的哈希表解法&#xff0c;并对两者进行对比&#xff0c;适合算法入门和面试准备。 &#x1f4a1; 问题描述 …

【保姆级】Nginx简介以及安装

Nginx简介 ​ Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于20…

C++(25): 标准库 <deque>

目录 1、 核心概念 2. 基本语法 3. 特点 4. 特有成员函数 5. 内存与性能 6. 示例代码 7. 成员函数列表 8. 使用场景 9. 注意事项 1、 核心概念 双端队列(Double-Ended Queue,deque) 是一种允许在队列头部和尾部高效插入和删除元素的线性数据结构,同时支持随机访问。…