
Java 中读取 Excel 文件是企业应用中的常见需求,尤其是在处理报表、财务数据、用户信息或第三方系统集成时。无论你是在构建数据导入功能、执行电子表格分析,还是将 Excel 解析集成到 Web 应用中,掌握如何高效地在 Java 中读取 Excel 文件都非常重要。
在本教程中,你将学习如何使用 Java 读取 .xls 和 .xlsx 格式的 Excel 文件。我们将通过实用的 Java 代码示例,演示如何处理大型文件、从 InputStream 读取 Excel,以及逐行提取指定内容等操作。
- 1. 搭建 Java 项目
- 2. 如何在 Java 中读取 XLSX 和 XLS 文件
- 3. 读取大型 Excel 文件的最佳实践
- 4. 完整示例:Java 读取 Excel 文件程序
- 5. 总结
- 6. FAQs 常见问题
1. 搭建 Java 项目
要在 Java 中读取 Excel 文件,你需要一个支持电子表格文件格式的库。Spire.XLS for Java 同时支持 .xls(旧版 Excel 格式)和 .xlsx(基于 XML 的现代格式),并提供高级 API,使 Excel 文件读取更加简单高效。
将 Spire.XLS 添加到项目中
如果你使用 Maven,请将以下内容添加到 pom.xml 中:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.4.1</version>
</dependency>
</dependencies>
如果你未使用 Maven,也可以从 Spire.XLS 官网手动下载 JAR 包并添加到 classpath 中。
对于较轻量级的 Excel 处理需求,你也可以选择使用 Free Spire.XLS for Java。
2. 如何在 Java 中读取 XLSX 和 XLS 文件
Java 程序可以通过加载工作簿(Workbook),然后遍历工作表、行和单元格来读取 Excel 文件。.xlsx 是现代 Excel 中最常用的格式,而 .xls 是其早期的二进制格式。幸运的是,Spire.XLS 使用同一套代码即可无缝支持两种格式。
加载并读取 Excel 文件(XLSX 或 XLS)
下面是一个加载 Excel 文件并打印其内容的基础示例:
import com.spire.xls.*;
public class ReadExcel {
public static void main(String[] args) {
// 创建 Workbook 对象并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromFile("data.xlsx"); // 或 "data.xls"
// 获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 遍历已使用的行和列
for (int i = 1; i <= sheet.getLastRow(); i++) {
for (int j = 1; j <= sheet.getLastColumn(); j++) {
// 获取单元格文本
String cellText = sheet.getCellRange(i, j).getValue();
System.out.print(cellText + "\t");
}
System.out.println();
}
}
}
你可以直接将文件路径替换为 .xls 文件,代码无需修改。这意味着你可以使用同一套 Java 代码读取不同格式的 Excel 文件。
读取的 Excel 文件以及控制台输出结果如下图所示:

使用 Row 对象逐行读取 Excel 文件
在用户数据校验或业务规则处理等场景下,将每一行作为一条数据记录进行处理通常更加直观。此时,你可以通过 getRows() 方法,使用行对象逐行读取 Excel:
for (int i = 0; i < sheet.getRows().length; i++) {
// 获取一行
CellRange row = sheet.getRows()[i];
if (row != null && !row.isBlank()) {
for (int j = 0; j < row.getColumns().length; j++) {
String text = row.getColumns()[j].getText();
System.out.print((text != null ? text : "") + "\t");
}
System.out.println();
}
}
这种方式特别适合批量处理 Excel 数据,或仅需按行处理数据的场景。
从 InputStream 读取 Excel 文件
在 Web 应用或云服务中,Excel 文件通常会以流的形式接收。下面演示如何在 Java 中通过 InputStream 读取 Excel 文件:
import com.spire.xls.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class ReadExcel {
public static void main(String[] args) throws FileNotFoundException {
// 创建 InputStream
InputStream stream = new FileInputStream("data.xlsx");
// 从流中加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromStream(stream);
System.out.println("Excel 文件加载成功。");
}
}
这种方式非常适用于处理文件上传、邮件附件或远程存储中的 Excel 文件。
读取不同格式的 Excel 单元格值
加载 Excel 文件并获取单元格对象后,Spire.XLS 支持以多种形式读取单元格内容——格式化文本、原始值、公式等。
示例如下:
CellRange cell = sheet.getRange().get(2, 1); // B2
// 格式化文本(Excel 中显示的内容)
String text = cell.getText();
// 原始字符串值
String value = cell.getValue();
// 通用对象(数字、布尔值、日期等)
Object rawValue = cell.getValue2();
// 公式(如果存在)
String formula = cell.getFormula();
// 公式计算结果
String result = cell.getEnvalutedValue();
// 数值类型
double number = cell.getNumberValue();
// 日期类型
java.util.Date date = cell.getDateTimeValue();
// 布尔类型
boolean bool = cell.getBooleanValue();
提示:getValue2() 更适合灵活处理数据,因为它返回真实的数据对象。getText() 更适合获取与 Excel 中显示一致的内容。
你可能还想要知道:如何在 Java 中将数据写入 Excel 文件
3. 在 Java 中读取大型 Excel 文件的最佳实践
当 Excel 文件包含数万行数据或多个工作表时,性能可能会成为问题。为了确保 Java 应用能够高效读取大型 Excel 文件,建议遵循以下最佳实践:
- 仅加载需要的工作表
- 仅访问相关的列或行
- 避免将整个工作表一次性存入内存
- 采用逐行读取模式
下面是一个仅处理非空行的高效读取示例:
for (int i = 1; i <= sheet.getRows().length; i++) {
Row row = sheet.getRows()[i];
if (row != null && !row.isBlank()) {
// 仅处理有数据的行
}
}
尽管 Spire.XLS 能高效地管理内存,但遵循这些实践能够帮助你的 Java Excel 读取逻辑更好地扩展。
4. 完整示例:Java 读取 Excel 文件程序
下面是一个完整的可运行 Java 示例,用于读取一个包含姓名、电子邮件、年龄、部门和状态等扩展列的 Excel 文件(users.xlsx)。代码仅提取前三列(姓名、邮箱、年龄),并筛选出年龄在 30 岁及以上的用户输出。
import com.spire.xls.*;
public class ExcelReader {
public static void main(String[] args) {
Workbook workbook = new Workbook();
workbook.loadFromFile("users.xlsx");
Worksheet sheet = workbook.getWorksheets().get(0);
System.out.println("姓名\t电子邮件\t年龄");
for (int i = 2; i <= sheet.getLastRow(); i++) {
String name = sheet.getCellRange(i, 1).getValue();
String email = sheet.getCellRange(i, 2).getValue();
String ageText = sheet.getCellRange(i, 3).getValue();
int age = 0;
try {
age = Integer.parseInt(ageText);
} catch (NumberFormatException e) {
continue; // 跳过年龄数据无效的行
}
if (age >= 30) {
System.out.println(name + "\t" + email + "\t" + age);
}
}
}
}
程序运行结果如下图所示:

该示例展示了如何在 Java 中读取 Excel 指定单元格的数据,并输出有意义的表格信息,同时还能对数据(如年龄)进行筛选处理。
5. 总结
本文介绍了如何使用 Spire.XLS for Java 在 Java 中读取 Excel 文件,包括 .xls 和 .xlsx 两种格式。你已经学习了:
- 搭建具有 Excel 读取功能的 Java 项目
- 使用 Java 以逐行或基于流的方式读取 Excel 文件
- 使用相同的 API 处理旧版和现代 Excel 格式
- 在处理大型 Excel 文件时应用最佳实践
无论你是处理上传的 Excel 文件、静态报表,还是流式数据,本教程中的示例都能够帮助你在 Java 应用中构建健壮的 Excel 处理功能。
如果你想解锁所有限制并体验完整的 Excel 处理能力,可以申请免费的临时许可证。
6. FAQs 常见问题
问题1:如何在 Java 中动态读取 Excel 文件?
答:要在 Java 中动态读取 Excel 文件——特别是当行数或列数未知时——你可以使用 getLastRow() 和 getLastColumn() 方法在运行时确定数据范围。这确保你的程序能适应各种大小的电子表格,而无需硬编码限制。
问题2:如何在 Java 中提取 Excel 数据?
答:你可以通过遍历工作簿中的单元格来提取 Excel 数据,例如:getCellRange(row, column).getValue()。像 Spire.XLS for Java 这样的库能够简化该过程,并同时支持 .xls 与 .xlsx 格式。
问题3:如何在 Java 中读取 CSV 文件?
答:如果 Excel 数据保存为 CSV 文件,可以使用 Java 的 BufferedReader 或文件流读取。
此外,Spire.XLS 也支持直接解析 CSV——你可以通过指定分隔符来加载 CSV 文件,例如 Workbook.loadFromFile("data.csv", ",")。这样你就能使用同一套 API 处理 CSV 与 Excel 文件。
问题4:如何通过 InputStream 在 Java 中读取 Excel 文件?
答:在服务端应用中(例如文件上传场景),通过 InputStream 读取 Excel 文件非常常见。使用 Spire.XLS 时,只需调用 workbook.loadFromStream(inputStream),随后即可像处理普通 Excel 文件一样进行读取和操作。







