Java 和 Apache POI 处理 Excel 文件

news/2025/11/20 23:04:26/文章来源:https://www.cnblogs.com/ocr12/p/19249838

一、引言

在企业应用中,Excel 是一种常见的数据存储和交换格式。Java 通过 Apache POI 库可以高效地读取、修改和写入 Excel 文件。本文介绍如何使用 Java 处理 Excel 文件,包括读取、写入和修改数据。

二、环境准备
2.1 安装 Java 开发环境

下载并安装 Java SDK:Oracle JDK 下载

验证安装:

java -version

2.2 添加 Maven 依赖

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

org.apache.poipoi-ooxml5.2.3

三、代码实现
3.1 读取 Excel 文件

以下示例代码演示如何读取 Excel 文件的内容:

package com.example;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadExcel {

public static void main(String[] args) {String filePath = "data.xlsx"; // Excel 文件路径try (FileInputStream fis = new FileInputStream(new File(filePath));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:System.out.print(cell.getNumericCellValue() + "\t");break;default:System.out.print("未知类型\t");}}System.out.println();}} catch (IOException e) {e.printStackTrace();}
}

}

运行结果(示例 Excel 文件):

姓名 年龄 成绩
张三 23 85.5
李四 25 90.2

3.2 写入 Excel 文件

以下示例代码演示如何创建并写入 Excel 文件:

package com.example;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteExcel {

public static void main(String[] args) {Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("学生成绩");// 创建表头Row headerRow = sheet.createRow(0);headerRow.createCell(0).setCellValue("姓名");headerRow.createCell(1).setCellValue("年龄");headerRow.createCell(2).setCellValue("成绩");// 添加数据Object[][] data = {{"张三", 23, 85.5},{"李四", 25, 90.2}};int rowNum = 1;for (Object[] rowData : data) {Row row = sheet.createRow(rowNum++);for (int i = 0; i < rowData.length; i++) {if (rowData[i] instanceof String) {row.createCell(i).setCellValue((String) rowData[i]);} else if (rowData[i] instanceof Integer) {row.createCell(i).setCellValue((Integer) rowData[i]);} else if (rowData[i] instanceof Double) {row.createCell(i).setCellValue((Double) rowData[i]);}}}// 保存 Excel 文件try (FileOutputStream fos = new FileOutputStream(new File("output.xlsx"))) {workbook.write(fos);System.out.println("Excel 文件写入成功!");} catch (IOException e) {e.printStackTrace();}try {workbook.close();} catch (IOException e) {e.printStackTrace();}
}

}

运行结果:生成 output.xlsx 文件,包含以下数据:

姓名 年龄 成绩
张三 23 85.5
李四 25 90.2

3.3 修改 Excel 文件

以下示例代码演示如何修改 Excel 文件中的数据:

package com.example;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;

public class ModifyExcel {

public static void main(String[] args) {String filePath = "output.xlsx";try (FileInputStream fis = new FileInputStream(new File(filePath));Workbook workbook = new XSSFWorkbook(fis)) {Sheet sheet = workbook.getSheetAt(0);// 修改第一行第二列的数据Row row = sheet.getRow(1);if (row != null) {Cell cell = row.getCell(2);if (cell != null) {cell.setCellValue(95.0); // 修改成绩}}// 保存修改后的 Excel 文件try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {workbook.write(fos);System.out.println("Excel 文件修改成功!");}} catch (IOException e) {e.printStackTrace();}
}

}

运行结果:output.xlsx 文件中 张三 的成绩被修改为 95.0。

四、优化与扩展

支持 CSV 读取:扩展程序支持 CSV 格式文件的读取和写入。

批量处理数据:支持从数据库读取数据并写入 Excel。

格式化 Excel:使用 Apache POI 提供的 CellStyle 进行单元格格式化,如字体加粗、颜色填充等。

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

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

相关文章

rust第二篇:语法学习

rust第二篇:语法学习rust用关键字fn定义函数,形参后面紧跟一个冒号,之后才是变量类型,返回值类型前有一个->,函数实现中最后可以省略return关键字。 rust用let声明变量,变量类型可以省略,编辑器会自动推导。…

啊队队队第二次团队作业--原型设计+概要设计

第二次团队作业作业所属课程 班级的链接作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/14580作业目标 提交原型设计,系统设计,数据库设计以及相关需求分析的文档团队名称 啊对对…

IO 2024 Round 3(团体赛)Unofficial Mirror

IO 2024 Round 3(团体赛)Unofficial Mirror 停课集训周三休息没啥事干继续打团战。 队员: yangjinhua Hexiuqi 无名之雾 赛前写了个随机数选择使用 Hexiuqi 的号。 很早吃完饭从食堂往回走,期间 hxq 疯狂想要站在我…

有志青年

我从他的身上看到了青年人应有的奋进昂扬的姿态,和我颇为相似的他,让我在竞赛时被压制抛弃的价值观得到认可,让我重拾自信,我不再相信我要去迎合他人的想法,去刻意合群,我也不再对自己曾经信奉的价值观评头品足。…

python舆情分析可视化平台 情感分析 微博 爬虫 scrapy爬虫手艺 朴素贝叶斯分类算法大数据 计算机✅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

90%的OKR都写成了KPI?其实你缺的不是表格,而是教练

本文针对OKR流于形式变成KPI的痛点,介绍了一套专业的AI指令,能扮演"OKR教练"角色。通过产品经理的实战案例对比,展示了如何用AI将模糊的任务清单转化为具备挑战性和价值导向的OKR体系,帮助团队实现真正的…

Python thread lambda run multiple functions

import datetime import uuid import time import numpy as np import threadingdef get_uuid_time():return f"{uuid.uuid4().hex}_{datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")}"def …

数据分析核心术语略解 - 指南

数据分析核心术语略解 - 指南2025-11-20 22:53 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

我为什么要学MCP?

以下内容完全紧扣官方文档,目的在于提取主要内容方便小白理解。 由于是了解 MCP 理论的文章,这里暂时不做 MCP server/client 代码的实战讲解。一、概念 MCP 是一个为大型语言模型(LLM)与“外部世界”(文件、数据…

storybook 和 vitepress选哪个作为组件文档站点更合适

选择 Storybook 还是 VitePress 作为 Vue 3 组件库的文档站点,取决于你的核心目标:如果你侧重 交互式组件开发、调试、测试和设计系统管理 → 选 Storybook。 如果你侧重 轻量、快速、内容导向的技术文档(含示例) …

csp-s 2025 随笔

csp-s2025 T2 考场的时候把 $k<=10$ 看成 $k<=1e4$ 了,当时想了半天我说 CCF 怎么这次出的那么难呢,拿了个特殊性质 A 就跑了,你的这就算了吧,更可恶的是开二维数组 a[maxn][maxn](maxn=1e4+5)直接 MLE 了…

消费电子的可创作内容已经不属于可持续性竭泽而渔

我差不多就是标题这个意思,我写这个的另一个原因是我对这些东西已经逐渐失去兴趣了,而今天我们看见了一个人也陷入了这个陷阱,那我就随便写点啥,其次二手玫瑰乐队的主唱梁龙曾说过“创新也会挨骂,守旧也会挨骂”,…

内网穿透配置和使用 - Rainbow

@目录内网穿透配置和使用NatApp和Ngrok的使用NatApp的使用Ngrok的使用最后: 内网穿透配置和使用 NatApp和Ngrok的使用 NatApp的使用 NatAPP 官网:https://natapp.cn/article/natapp_newbie购买隧道:配置消息:启动:…

Swift 快速上手

https://docs.swift.org/swift-book/documentation/the-swift-programming-language 这是笔者上手 Swift 时做的笔记。 简单值 常用的基本类型:Int、Double、Bool、String 集合类型:Array、Set、Dict 使用 var 创建变…

[ARC195D] Swap and Erase 分析

题目概述 给定一个数列 $ A = (A_1, \ldots, A_N) $。你可以对 $ A $ 进行以下两种操作,顺序和次数不限:交换操作:设操作前 $ A $ 的长度为 $ K $。选择满足 $ 1 \leq i \leq K - 1 $ 的整数 $ i $,交换 $ A $ 的第…

20251118 正睿

25noip赠送赛day2之不住全季 B \(y\) 没用,将 \(x, y\) 都除以 \(y\) 即可将 \(y\) 变成 \(1\)。 对于两个人 \(i, j\) 来说,只有当 \(x = \frac{b_i - b_j}{a_j - a_i}\) 时他们的顺序才能调换,否则就是确定的。转…

13. Spring AI 的观测性 - Rainbow

13. Spring AI 的观测性 @目录13. Spring AI 的观测性观测性为什么Spring AI应用急需可观测性?AI服务成本失控的痛点Spring AI可观测性的价值实战演练:构建可观测的Spring AI翻译应用第一步:Spring AI项目初始化第二…

Elasticsearch8.4.1升级Elasticsearch9.1.5 - 实践

Elasticsearch8.4.1升级Elasticsearch9.1.5 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

为什么大型炼钢厂(宝武、鞍钢、首钢等)都离不开时序数据库?

钢铁生产是典型的连续化工业流程 —— 从高炉炼铁的原料投入,到转炉炼钢的温度调控,再到轧钢环节的精度控制,每个工序都需依托实时数据调整操作。宝武、鞍钢、首钢等大型炼钢厂,由于生产规模大、设备数量多、工艺链…