POI 的 Excel 读写操作教程
POI 的 Excel 读写操作教程
一、POI 简介
Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改,还为 Java 开发者在处理 Excel 相关业务时提供了极大的便利。
二、POI 的 Excel 读写操作案例
(一)引入依赖
在 Maven 项目中使用 POI 时,需要在 pom.xml 文件中添加 POI 相关的依赖。以下是配置示例:
<dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version></dependency>
</dependencies>
添加上述依赖后,Maven 会自动下载并管理 POI 及其相关依赖项,确保项目能够顺利使用 POI 的功能。
(二)写入 Excel 文件
以下是一个基础的示例,展示如何使用 POI 将数据写入 Excel 文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;public class ExcelWriteExample {public static void main(String[] args) {// 创建一个新的 Excel 工作簿,使用 XSSFWorkbook 表示 Excel 2007 及以上版本的 .xlsx 格式Workbook workbook = new XSSFWorkbook();// 在工作簿中创建一个名为 "Sheet1" 的工作表Sheet sheet = workbook.createSheet("Sheet1");// 定义要写入的数据,采用二维数组的形式String[][] data = {{"姓名", "年龄", "性别"},{"张三", "25", "男"},{"李四", "30", "女"}};// 遍历数据数组,逐行逐列将数据写入工作表for (int i = 0; i < data.length; i++) {Row row = sheet.createRow(i);for (int j = 0; j < data[i].length; j++) {Cell cell = row.createCell(j);cell.setCellValue(data[i][j]);}}// 将数据保存到文件系统中try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {workbook.write(fos);System.out.println("文件写入成功!");} catch (IOException e) {e.printStackTrace();} finally {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}}
}
运行该代码后,会在项目根目录下生成一个名为 example.xlsx 的 Excel 文件,文件中包含预定义的数据。
(三)读取 Excel 文件
以下是读取上述 Excel 文件内容的代码示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;public class ExcelReadExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("example.xlsx")) {// 通过文件输入流创建工作簿对象Workbook workbook = new XSSFWorkbook(fis);// 获取工作簿中的第一个工作表Sheet sheet = workbook.getSheetAt(0);// 遍历工作表中的每一行for (Row row : sheet) {// 遍历当前行中的每一个单元格for (Cell cell : row) {switch (cell.getCellType()) {case STRING:System.out.print(cell.getStringCellValue() + "\t");break;case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {System.out.print(cell.getDateCellValue() + "\t");} else {System.out.print(cell.getNumericCellValue() + "\t");}break;case BOOLEAN:System.out.print(cell.getBooleanCellValue() + "\t");break;default:System.out.print("\t");}}System.out.println();}workbook.close();} catch (IOException e) {e.printStackTrace();}}
}
运行该代码,控制台将输出 Excel 文件中的所有数据,按行列顺序展示。
三、内存问题及优化
(一)内存问题示例
在处理大文件时,如果将整个 Excel 文件加载到内存中,可能会导致内存溢出。例如:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream;
import java.io.IOException;public class MemoryProblemExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("large_file.xlsx")) {Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0);// 大文件加载到内存可能会导致 OutOfMemoryError} catch (IOException e) {e.printStackTrace();}}
}
当文件 large_file.xlsx 很大时,调用 XSSFWorkbook(fis) 可能会消耗大量内存,导致 OutOfMemoryError。
(二)优化方法
- 使用
SXSSFWorkbook写入大文件:SXSSFWorkbook是XSSFWorkbook的流式写入版本,它采用了逐行写入的方式,避免将所有数据一次性加载到内存中。如下示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;public class ExcelWriteLargeFileExample {public static void main(String[] args) {Workbook workbook = new SXSSFWorkbook(100); // 设置内存中最多保留 100 行Sheet sheet = workbook.createSheet("Sheet1");for (int i = 0; i < 10000; i++) {Row row = sheet.createRow(i);for (int j = 0; j < 3; j++) {Cell cell = row.createCell(j);cell.setCellValue("数据" + i + "-" + j);}}try (FileOutputStream fos = new FileOutputStream("large_example.xlsx")) {workbook.write(fos);System.out.println("大文件写入成功!");} catch (IOException e) {e.printStackTrace();} finally {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}}
}
- 分批读取大文件:对于大文件的读取,可以通过分批读取的方式逐步加载数据,降低内存压力。例如,可以设置每次读取固定数量的行,处理完成后再继续读取下一批数据。开发者可以根据实际需求灵活实现。
四、常见 Excel 操作工具
除了 POI,Java 生态中还有其他一些常用的 Excel 操作库,下面简要介绍几种:
- Hutool:Hutool 是一个功能丰富的 Java 工具包,提供了对 POI 的封装,简化了 Excel 文件的操作。示例代码如下:
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;import java.util.List;
import java.util.Map;public class HutoolExcelExample {public static void main(String[] args) {ExcelReader reader = ExcelUtil.getReader("example.xlsx");List<Map<String, Object>> rows = reader.readAll();for (Map<String, Object> row : rows) {System.out.println(row);}}
}
-
JXL:JXL 是一个较为简单的 Excel 操作库,适用于处理
.xls格式的文件。由于对.xlsx格式支持较弱,它更适用于旧版 Excel 文件。 -
EasyExcel:EasyExcel 是阿里巴巴开源的一个高效 Excel 处理工具,特别适用于大数据量的 Excel 文件,内存消耗较低。以下是使用 EasyExcel 写入文件的示例:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;import java.util.ArrayList;
import java.util.List;public class EasyExcelExample {public static void main(String[] args) {String fileName = "easyexcel_example.xlsx";List<Data> dataList = new ArrayList<>();for (int i = 0; i < 10; i++) {Data data = new Data("姓名" + i, i, "性别" + i);dataList.add(data);}EasyExcel.write(fileName, Data.class).sheet("Sheet1").doWrite(dataList);}public static class Data {private String name;private int age;private String gender;public Data(String name, int age, String gender) {this.name = name;this.age = age;this.gender =gender;}// Getters and Setters}
}
总结
本文详细介绍了如何使用 Apache POI 进行 Excel 文件的读写操作,包括常见的使用场景和一些优化建议。对于需要处理大数据量的 Excel 文件,介绍了 SXSSFWorkbook 的使用方法,避免内存溢出问题。此外,还简要介绍了其他流行的 Excel 操作工具,如 Hutool、JXL 和 EasyExcel,它们各具特色,适合不同的需求。
通过掌握这些工具和技巧,你可以在 Java 项目中高效地处理 Excel 文件,提升开发效率和应用性能。
相关文章:
POI 的 Excel 读写操作教程
POI 的 Excel 读写操作教程 一、POI 简介 Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改&am…...
ROS2 话题通信
1. 基本概念 发布-订阅模型:节点间通过话题(Topic)异步通信,发布者(Publisher)发送消息,订阅者(Subscriber)接收消息。 话题(Topic):…...
【学习资源】时间序列数据分析方法(1)
时间序列数据分析是一个有趣的话题,让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法:信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…...
Hadoop集群安装与配置指南(CentOS 7)
Hadoop集群安装与配置指南(CentOS 7) 一、虚拟机准备 安装虚拟机软件 下载VMware或VirtualBox,完成安装并激活。 注意:选择NAT模式,配置子网IP(如192.168.10.0)。 CentOS 7安装 下载CentOS 7…...
Streamlit与Qlib:量化投资策略可视化实战
Streamlit与Qlib:量化投资策略可视化实战 1. 项目背景 在量化投资领域,数据可视化是理解和展示投资策略的关键。本文将详细介绍如何使用Streamlit和Qlib构建一个交互式的量化投资策略可视化应用。 2. 环境准备 2.1 安装依赖 # 安装必要的库 pip ins…...
Ceph集群搭建2025(squid版)
squid版本维护年限 apt install -y cephadmecho >> "deb http://mirrors.163.com/ceph/debian-squid/ bookworm main" echo >> "deb-src http://mirrors.163.com/ceph/debian-squid/ bookworm main"#安装源 cephadm install #开始初始化一个最…...
机器学习实战(3):线性回归——预测连续变量
第3集:线性回归——预测连续变量 在机器学习的世界中,线性回归是最基础、最直观的算法之一。它用于解决回归问题,即预测连续变量(如房价、销售额等)。尽管简单,但线性回归却是许多复杂模型的基石。今天我们…...
【AI-34】机器学习常用七大算法
以下是对这七大常用算法的浅显易懂解释: 1. k 邻近算法(k - Nearest Neighbors,KNN) 想象你在一个满是水果的大广场上,现在有个不认识的水果,想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...
【漫话机器学习系列】093.代价函数和损失函数(Cost and Loss Functions)
代价函数和损失函数(Cost and Loss Functions)详解 1. 引言 在机器学习和深度学习领域,代价函数(Cost Function)和损失函数(Loss Function)是核心概念,它们决定了模型的优化方向。…...
ThreadLocal为什么会内存溢出
每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...
LabVIEW 天然气水合物电声联合探测
天然气水合物被认为是潜在的清洁能源,其储量丰富,预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性,天然气水合物的探测面临诸多挑战,涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…...
【记忆化搜索】最长递增子序列
文章目录 300. 最长递增子序列解题思路:递归 -> 记忆化搜索 300. 最长递增子序列 300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除&am…...
Tomcat的升级
一、为什么Tomcat需要升级 在生产环境中,我们都会指定对应的Tomcat版本进行安排配置,但是由于Tomcat厂商对于小版本的更新迭代会将一些Bug修复,这个时候在生产中出现问题/预防出现问题,可以通过小版本的升级解决前提:…...
4-制作UI
创建模块文件夹 Unity编辑器->Tools->YIUI自动化工具,在新增模块名称那里输入模块名字并点击创建。便可看到在GameRes/YIUI文件夹下有新建的文件夹与内容了。里面包含图集、预制体、Sprites。如果进行预制体的修改,则需要双击进入再修改࿰…...
零基础学习人工智能
零基础学习人工智能是一个既充满挑战又极具潜力的过程。以下是一份详细的学习指南,旨在帮助零基础的学习者有效地踏入人工智能领域。 一、理解基本概念 在学习人工智能之前,首先要对其基本概念有一个清晰的认识。人工智能(AI)是…...
vue3+element-plus中的el-table表头和el-table-column内容全部一行显示完整(hook函数)
hook函数封装 export const useTableColumnWidth _this > {const { refTable } _thisconst columnWidthObj ref()const getTableColumnWidth cb > {nextTick(() > {columnWidthObj.value {}// 获取行rowsconst tableEle refTable?.refBaseTable?.$elif (!tab…...
Word写论文常用操作的参考文章
1.插入多个引用文献:word中交叉引用多篇参考文献格式[1-2]操作以及显示错误问题 更改左域名,输入 \#"[0" 更改右域名,输入 \#"0]" 2.插入题注:word 中添加图片题注、目录、内部链接 3.插入公式编号&#x…...
深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
一、蛋白质-蛋白质相互作用(PPI)的定义与生物学意义 蛋白质-蛋白质相互作用(Protein-Protein Interaction, PPI)是指两个或多个蛋白质通过物理结合形成复合物,进而调控细胞信号传导、代谢、免疫应答等生命活动的过程。…...
C++基础知识(三)之结构体、共同体、枚举、引用、函数重载
九、结构体、共同体和枚举 1、结构体的基本概念 结构体是用户自定义的类型,可以将多种数据的表示合并到一起,描述一个完整的对象。 使用结构体有两个步骤:1)定义结构体描述(类型);2ÿ…...
【java】方法的值传递
在 Java 中,方法的值传递 是指将实参的值传递给方法的形参。Java 中只有 值传递,没有引用传递。具体来说: 对于 基本数据类型,传递的是值的副本。 对于 引用数据类型,传递的是引用的副本(即地址的副本&…...
DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
使用Python爬虫实时监控行业新闻案例
目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代,新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…...
Centos搭建python环境
在 CentOS 上配置 Python 环境可以通过以下步骤完成: 1. 检查系统自带 Python 版本 CentOS 7/8 可能已经自带了 Python: python3 --version 如果没有,或者版本过低,可以手动安装。 2. 安装 Python(推荐࿰…...
语言大模型基础概念 一(先了解听说过的名词都是什么)
SFT(监督微调)和RLHF(基于人类反馈的强化学习)的区别 STF(Supervised Fine-Tuning)和RLHF(Reinforcement Learning from Human Feedback)是两种不同的模型训练方法,分别…...
DeepSeek-R1 蒸馏 Qwen 和 Llama 架构 企业级RAG知识库
“DeepSeek-R1的输出,蒸馏了6个小模型”意思是利用DeepSeek-R1这个大模型的输出结果,通过知识蒸馏技术训练出6个参数规模较小的模型,以下是具体解释: - **知识蒸馏技术原理**:知识蒸馏是一种模型压缩技术,核…...
ubuntu服务器 如何配置安全加固措施
下面提供一个更详细、一步步的服务器安全加固指南,适合新手操作。我们将从 Fail2Ban、SSH(密钥认证及端口更改)、Nginx 速率限制和日志轮转四个方面进行优化,同时补充一些额外的安全建议。 新的服务器,通常我们会创建一…...
DeepSeek v3 技术报告阅读笔记
注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解,为笔记/大纲性质而非教程,建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心: MLA 高效推理DeepSeekMOE 更…...
Spring 事务及管理方式
Spring 事务管理是 Spring 框架的核心功能之一,它为开发者提供了一种方便、灵活且强大的方式来管理数据库事务。 1、事务的基本概念 事务是一组不可分割的操作序列,这些操作要么全部成功执行,要么全部失败回滚,以确保数据的一致…...
GESP2024年9月认证C++七级( 第三部分编程题(1)小杨寻宝)
参考程序: #include <bits/stdc.h> using namespace std; const int N 1e510; vector<int> g[N]; // 图的邻接表 int col[N], dep[N], has[N];// 深度优先遍历,计算每个节点的深度 void dfs(int x, int fa) {dep[x] dep[fa] 1; // 计算…...
Pandas数据填充(fill)中的那些坑:避免机器学习中的数据泄露
1. 问题背景 在处理时间序列数据时,经常会遇到缺失值需要填充。Pandas提供了ffill(forward fill)和bfill(backward fill)两种填充方式,但使用不当可能会导致数据泄露,特别是在进行机器学习预测时。 2. 填充方式解析 2.1 基本概念 ffill(forward fill): 用前面的值填充后面的…...
