jxl 是一个比较老牌的 Java 操作 Excel 的库,特点是 API 简单、易用,但它有一个致命的缺点:不支持较新版本的 .xlsx 格式,只支持旧的 .xls 格式。目前新项目强烈推荐使用 Apache POI。

如果你需要维护旧项目或处理 .xls 文件,了解 jxl 仍然是有价值的。
第一步:准备工作(添加依赖)
你需要在你的项目中添加 jxl 的依赖,如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version> <!-- 这是 jxl 最常用且稳定的版本 -->
</dependency>
如果你不使用 Maven,可以去 Maven 中央仓库 下载 jxl-2.6.12.jar 文件,然后将其添加到你的项目类路径(Classpath)中。
第二步:核心 API 介绍
jxl 的核心类都在 jxl 包下。

| 类名 | 作用 |
|---|---|
Workbook |
代表整个 Excel 工作簿,可以通过 Workbook.getWorkbook() 方法打开一个已存在的 Excel 文件。 |
Sheet |
代表工作簿中的一个工作表,可以通过 Workbook.getSheet() 方法获取。 |
Cell |
代表工作表中的一个单元格,可以通过 Sheet.getCell() 方法获取。 |
CellType |
枚举类型,表示单元格的数据类型(如 Label, Number, Date 等)。 |
第三步:代码实现(完整示例)
下面是一个完整的、可运行的 Java 示例,演示如何读取一个名为 data.xls 的 Excel 文件,并打印其中的内容。
准备一个 data.xls 文件
假设你的项目根目录下有一个 data.xls 文件,内容如下:
| 姓名 | 年龄 | 入职日期 |
|---|---|---|
| 张三 | 28 | 2025-05-10 |
| 李四 | 32 | 2025-08-22 |
| 王五 | 25 | 2025-01-15 |
Java 读取代码
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
public class JxlExcelReader {
public static void main(String[] args) {
// 1. 指定要读取的Excel文件路径
// 请确保 data.xls 文件存在于你项目的根目录下,或者提供正确的绝对路径
File excelFile = new File("data.xls");
// 使用 try-with-resources 语句来自动关闭资源
try (Workbook workbook = Workbook.getWorkbook(excelFile)) {
// 2. 获取第一个工作表 (Sheet)
// 参数 0 表示第一个工作表,你也可以通过名称获取:workbook.getSheet("Sheet1");
Sheet sheet = workbook.getSheet(0);
// 3. 获取工作表的行数和列数
int rows = sheet.getRows();
int cols = sheet.getColumns();
System.out.println("工作表名称: " + sheet.getName());
System.out.println("总行数: " + rows);
System.out.println("总列数: " + cols);
System.out.println("----------------------------------------");
// 4. 遍历每一行和每一列,读取单元格内容
// 通常第一行是标题,所以从第二行开始读取数据 (i = 1)
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// 获取单元格对象
jxl.Cell cell = sheet.getCell(j, i);
// 获取单元格内容
String cellContent = cell.getContents();
// 打印单元格内容
System.out.print(cellContent + "\t"); // \t 用于对齐
}
System.out.println(); // 每行结束后换行
}
} catch (IOException e) {
System.err.println("读取文件时发生IO异常: " + e.getMessage());
} catch (BiffException e) {
System.err.println("解析Excel文件时发生异常: " + e.getMessage());
}
}
}
代码解析
-
File excelFile = new File("data.xls");创建一个File对象,指向你的 Excel 文件,请确保路径正确。 -
Workbook workbook = Workbook.getWorkbook(excelFile);这是核心步骤。Workbook.getWorkbook()方法会打开并读取整个 Excel 文件,返回一个Workbook对象,这个方法会加载整个文件到内存,所以对于非常大的文件要小心。
(图片来源网络,侵删) -
Sheet sheet = workbook.getSheet(0);从工作簿中获取第一个工作表,索引从 0 开始。 -
sheet.getRows()和sheet.getColumns()获取工作表的总行数和总列数。 -
双层
for循环 通过行和列的索引遍历所有单元格。 -
sheet.getCell(j, i)根据列索引j和行索引i获取一个Cell对象。 -
cell.getContents()获取单元格的原始内容,它总是返回一个String类型,这是jxl最简单的地方,但也是它的一个限制,因为它不区分数据类型。
第四步:进阶用法(处理不同数据类型)
虽然 getContents() 总是返回字符串,但 jxl 提供了 getType() 方法来获取单元格的真实类型,从而可以进行更精确的转换。
我们修改上面的代码,来正确处理数字和日期。
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
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;
import java.util.Date;
public class JxlExcelReaderAdvanced {
public static void main(String[] args) {
File excelFile = new File("data.xls");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try (Workbook workbook = Workbook.getWorkbook(excelFile)) {
Sheet sheet = workbook.getSheet(0);
int rows = sheet.getRows();
int cols = sheet.getColumns();
System.out.println("工作表名称: " + sheet.getName());
System.out.println("----------------------------------------");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
Cell cell = sheet.getCell(j, i);
CellType cellType = cell.getType();
String cellValue = "";
// 根据单元格类型进行不同处理
if (cellType == CellType.LABEL) {
// 文本类型
cellValue = cell.getContents();
} else if (cellType == CellType.NUMBER) {
// 数字类型
NumberCell numberCell = (NumberCell) cell;
double value = numberCell.getValue();
// 可以根据需求格式化,这里直接转为整数
cellValue = String.valueOf((int) value);
} else if (cellType == CellType.DATE) {
// 日期类型
DateCell dateCell = (DateCell) cell;
Date date = dateCell.getDate();
cellValue = sdf.format(date);
} else {
// 其他类型(如布尔、公式等)
cellValue = cell.getContents();
}
System.out.print(cellValue + "\t");
}
System.out.println();
}
} catch (IOException | BiffException e) {
e.printStackTrace();
}
}
}
代码解析
-
CellType cellType = cell.getType();获取单元格的类型。 -
if (cellType == CellType.NUMBER)判断是否为数字类型,如果是,我们将Cell强制转换为NumberCell,然后调用getValue()获取其double值。 -
if (cellType == CellType.DATE)判断是否为日期类型,如果是,我们将Cell强制转换为DateCell,然后调用getDate()获取其java.util.Date对象,最后用SimpleDateFormat格式化为我们想要的字符串。
第五步:jxl 的优缺点总结
优点
- API 简单易用:对于简单的读写操作,API 非常直观。
- 轻量级:相比于 Apache POI,
jxl的库文件较小。 - 性能较好:对于
.xls文件,读取速度通常不错。
缺点
- 不支持
.xlsx格式:这是最致命的缺点,导致它无法在现代办公环境中使用。 - 已停止维护:
jxl项目已经多年没有更新,没有新功能,也没有官方支持。 - 功能有限:不支持图表、图片、复杂公式等高级特性。
- 内存消耗大:
Workbook.getWorkbook()会一次性将整个 Excel 文件加载到内存中,对于大文件(如超过 100MB)可能会导致OutOfMemoryError。
结论与建议
| 场景 | 推荐库 | 理由 |
|---|---|---|
| 新项目 | Apache POI | 功能强大,支持 .xls 和 .xlsx,是业界标准,社区活跃。 |
| 维护旧项目 | jxl |
如果项目已经基于 jxl,且只处理 .xls 文件,可以继续使用。 |
处理超大 .xls 文件 |
EasyExcel (基于 POI) | EasyExcel 是阿里巴巴开源的,它通过 SAX 模式(流式读取)解决了 POI 和 jxl 内存占用大的问题,性能极佳。 |
虽然 jxl 是一个学习 Java 操作 Excel 的好起点,但在实际生产中,请务必选择 Apache POI 或其衍生库(如 EasyExcel)。
