jxl 是一个比较老牌且经典的 Java 操作 Excel 的库,它支持 .xls 格式(Excel 97-2003)。它不支持 .xlsx 格式,对于现代的 .xlsx 文件,你应该使用更现代的库,Apache POI。

准备工作:添加 JXL 依赖
你需要在你的项目中添加 jxl 的依赖,如果你使用 Maven,请在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version> <!-- 这是最常用的稳定版本 -->
</dependency>
如果你不使用 Maven,可以手动下载 jxl.jar 文件,并将其添加到你的项目的类路径(Classpath)中。
JXL 读取 Excel 的核心步骤
使用 JXL 读取 Excel 文件的基本流程如下:
- 获取工作簿对象 (
Workbook):通过文件路径或输入流打开 Excel 文件,得到一个Workbook对象。 - 获取工作表对象 (
Sheet):从Workbook对象中,根据索引(从 0 开始)或名称获取你需要读取的工作表。 - 获取单元格对象 (
Cell):遍历工作表的行和列,获取每个单元格的Cell对象。 - 读取单元格数据:根据单元格的数据类型(数字、字符串、日期等),使用相应的方法(如
getContents()、getNumber()等)获取数据。 - 关闭资源:关闭
Workbook对象以释放资源。
完整代码示例
假设我们有一个名为 test.xls 的 Excel 文件,内容如下:

| 姓名 | 年龄 | 入职日期 | 薪资 |
|---|---|---|---|
| 张三 | 28 | 2025-05-20 | 50 |
| 李四 | 32 | 2025-11-01 | 00 |
| 王五 | 25 | 2025-09-15 | 00 |
下面是一个完整的 Java 程序,用于读取这个 test.xls 文件并打印其内容。
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
public class JxlReadExample {
public static void main(String[] args) {
// 1. 定义要读取的Excel文件路径
String excelFilePath = "test.xls";
try {
// 2. 获取工作簿对象
// 注意:Workbook.getWorkbook() 方法会抛出 BiffException 和 IOException
Workbook workbook = Workbook.getWorkbook(new File(excelFilePath));
// 3. 获取第一个工作表(索引从0开始)
Sheet sheet = workbook.getSheet(0);
// 4. 遍历工作表的每一行和每一个单元格
// sheet.getRows() 获取总行数
// sheet.getColumns() 获取总列数
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
// 获取单元格对象
Cell cell = sheet.getCell(j, i);
// 获取单元格内容(通用方法,返回字符串)
String cellContent = cell.getContents();
// 为了格式化输出,可以加上制表符
System.out.print(cellContent + "\t");
}
// 每行打印完后换行
System.out.println();
}
// 5. 关闭工作簿,释放资源
workbook.close();
} catch (IOException e) {
System.err.println("文件读取或IO异常: " + e.getMessage());
e.printStackTrace();
} catch (BiffException e) {
System.err.println("Excel文件格式错误: " + e.getMessage());
e.printStackTrace();
}
}
}
输出结果:
姓名 年龄 入职日期 薪资
张三 28 2025-05-20 8500.5
李四 32 2025-11-01 12000.0
王五 25 2025-09-15 7500.0
更精细的数据类型读取
上面的例子中,cell.getContents() 总是返回 String 类型,如果我们想获取特定格式的数据(如数字、日期),需要先判断单元格的类型。
jxl 提供了 Cell 的子类来表示不同类型的单元格:

Label: 字符串类型Number: 数字类型Date: 日期类型
我们可以使用 Cell.getType() 方法来判断单元格类型。
import jxl.Cell;
import jxl.DateCell;
import jxl.LabelCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
public class JxlReadWithTypesExample {
public static void main(String[] args) {
String excelFilePath = "test.xls";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
try {
Workbook workbook = Workbook.getWorkbook(new File(excelFilePath));
Sheet sheet = workbook.getSheet(0);
// 跳过表头,从第二行开始读取数据
for (int i = 1; i < sheet.getRows(); i++) {
// 读取姓名 (字符串)
Cell nameCell = sheet.getCell(0, i);
String name = ((LabelCell) nameCell).getString();
// 读取年龄 (数字)
Cell ageCell = sheet.getCell(1, i);
int age = (int) ((NumberCell) ageCell).getValue();
// 读取入职日期 (日期)
Cell dateCell = sheet.getCell(2, i);
java.util.Date hireDate = ((DateCell) dateCell).getDate();
String formattedDate = dateFormat.format(hireDate);
// 读取薪资 (数字)
Cell salaryCell = sheet.getCell(3, i);
double salary = ((NumberCell) salaryCell).getValue();
// 打印格式化后的数据
System.out.println("姓名: " + name + ", 年龄: " + age +
", 入职日期: " + formattedDate +
", 薪资: " + salary);
}
workbook.close();
} catch (IOException | BiffException e) {
e.printStackTrace();
}
}
}
输出结果:
姓名: 张三, 年龄: 28, 入职日期: 2025年05月20日, 薪资: 8500.5
姓名: 李四, 年龄: 32, 入职日期: 2025年11月01日, 薪资: 12000.0
姓名: 王五, 年龄: 25, 入职日期: 2025年09月15日, 薪资: 7500.0
JXL 的主要优点和缺点
优点
- 轻量级:API 简单直观,学习成本低。
- 占用内存小:相比于 Apache POI,
jxl在处理大文件时内存占用更少。 - 性能较好:对于
.xls文件的读写,速度表现不错。
缺点
- 不支持
.xlsx格式:这是它最大的硬伤,现代 Excel 文件基本都是.xlsx格式。 - 停止更新:
jxl项目已经停止更新多年,没有后续维护和 bug 修复。 - 功能有限:不支持复杂的功能,如 Excel 公式、图表、宏等。
- 仅支持读:虽然
jxl也支持写,但其写入功能远不如 Apache POI 强大和灵活。
总结与建议
| 特性 | JXL | Apache POI (推荐) |
|---|---|---|
| 支持格式 | 仅 .xls |
.xls 和 .xlsx |
| 开发状态 | 已停止更新 | 活跃开发,社区强大 |
| 功能 | 基础读写 | 功能极其强大(公式、图表、样式等) |
| 内存占用 | 较低 | 较高,但有 SAX 模式优化 |
| 易用性 | 非常简单 | 相对复杂,但文档齐全 |
- 如果你只需要处理非常老的
.xls文件,且项目对依赖库的大小和更新频率没有要求,可以考虑使用jxl。 - 对于任何新项目,强烈推荐使用 Apache POI,它是目前 Java 操作 Excel 事实上的标准,功能全面、社区活跃、持续更新,能够满足绝大多数场景的需求。
