jxl 是一个比较老牌的 Java 操作 Excel 的库,特点是 API 简单易用,但它只支持旧版的 .xls 格式,不支持新版 .xlsx 格式,如果你的项目需求是兼容旧版 Office (如 Office 2003 及更早版本),或者只是简单的导出功能,jxl 是一个不错的选择。

环境准备
你需要在你的 Java 项目中添加 jxl 的依赖。
Maven 项目
在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
Gradle 项目
在 build.gradle 文件中添加:
implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
手动下载 JAR
如果你不使用构建工具,可以手动下载 JAR 包:
- 访问 Maven 中央仓库:https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl
- 找到
6.12版本,下载jxl.jar文件。 - 将下载的 JAR 文件添加到你的项目的 classpath 中。
核心 API 概念
在使用 jxl 之前,了解几个核心类和接口非常重要:
WritableWorkbook: 代表一个可写入的 Excel 工作簿,在写入数据前,必须先创建这个对象。WritableSheet: 代表工作簿中的一个工作表(Sheet),你可以创建多个 Sheet。Label: 代表 Excel 中的一个单元格,且单元格内容为字符串类型。Number: 代表 Excel 中的一个单元格,且单元格内容为数字类型。DateTime: 代表 Excel 中的一个单元格,且单元格内容为日期类型。jxl.write.WritableFont和jxl.write.WritableCellFormat: 用于设置单元格的字体和格式(如加粗、颜色、对齐方式等)。
完整代码示例
下面是一个完整的、可运行的 Java 示例,它将创建一个名为 "学生信息表.xls" 的文件,并向其中写入表头、数据,并应用一些格式。
import jxl.Workbook;
import jxl.write.*;
import jxl.write.Number;
import jxl.write.biff.RowsExceededException;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class JxlExportExample {
public static void main(String[] args) {
// 1. 定义要导出的文件路径
String filePath = "D:/temp/学生信息表.xls";
try {
// 2. 创建可写入的Excel工作簿对象
// Workbook.createWorkbook() 会覆盖已存在的同名文件
WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath));
// 3. 创建工作表,并指定名称
WritableSheet sheet = writableWorkbook.createSheet("学生列表", 0); // "学生列表"是Sheet名, 0是Sheet索引
// 4. 设置列宽(单位:1/256个字符宽度)
sheet.setColumnView(0, 15); // 第一列(姓名)宽度
sheet.setColumnView(1, 10); // 第二列(年龄)宽度
sheet.setColumnView(2, 20); // 第三列(入学日期)宽度
// 5. 创建单元格格式(用于表头)
WritableFont headerFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false);
WritableCellFormat headerFormat = new WritableCellFormat(headerFont);
headerFormat.setAlignment(jxl.format.Alignment.CENTRE); // 水平居中
headerFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); // 垂直居中
headerFormat.setBackground(jxl.format.Colour.GRAY_25); // 设置背景色
// 6. 创建表头
Label nameLabel = new Label(0, 0, "姓名", headerFormat);
Label ageLabel = new Label(1, 0, "年龄", headerFormat);
Label dateLabel = new Label(2, 0, "入学日期", headerFormat);
sheet.addCell(nameLabel);
sheet.addCell(ageLabel);
sheet.addCell(dateLabel);
// 7. 准备数据
Object[][] data = {
{"张三", 20, new Date()},
{"李四", 21, new Date()},
{"王五", 22, new Date()}
};
// 8. 创建数据行和单元格
for (int i = 0; i < data.length; i++) {
// 第 i+1 行,因为第 0 行是表头
int rowNum = i + 1;
// 姓名 (Label)
sheet.addCell(new Label(0, rowNum, (String) data[i][0]));
// 年龄 (Number)
sheet.addCell(new Number(1, rowNum, (Integer) data[i][1]));
// 入学日期 (DateTime)
sheet.addCell(new DateTime(2, rowNum, (Date) data[i][2]));
}
// 9. 写入数据并关闭工作簿
// 这一步非常关键,会将内存中的操作写入到文件中
writableWorkbook.write();
writableWorkbook.close();
System.out.println("Excel 文件导出成功!路径为: " + filePath);
} catch (IOException e) {
System.err.println("文件操作异常: " + e.getMessage());
e.printStackTrace();
} catch (WriteException e) {
System.err.println("Excel写入异常: " + e.getMessage());
e.printStackTrace();
}
}
}
代码解析
Workbook.createWorkbook(new File(filePath)): 这是导出的起点,它会创建一个指向指定文件路径的WritableWorkbook对象,如果文件已存在,它将被覆盖。writableWorkbook.createSheet(...): 在工作簿中创建一个新的工作表。sheet.setColumnView(...): 调整列的宽度,让表格更美观。WritableFont和WritableCellFormat: 这是jxl实现样式的核心,我们先定义字体(如加粗),然后用字体创建单元格格式,并设置对齐方式、背景色等。new Label(...),new Number(...),new DateTime(...): 根据数据类型创建不同的单元格对象。Label: 用于文本。Number: 用于整数或小数。DateTime: 用于日期类型。
sheet.addCell(...): 将创建好的单元格对象添加到工作表的指定位置(行和列)。writableWorkbook.write()和writableWorkbook.close(): 这两个步骤是必须的!write()方法将所有在内存中构建的 Excel 内容写入到磁盘文件中,close()则会释放资源并关闭工作簿,顺序不能错。
常见问题与注意事项
Q1: 如何合并单元格?
使用 WritableSheet 的 mergeCells(int col1, int row1, int col2, int row2) 方法。
// 合并第0列到第2列,第0行(即合并整个表头) sheet.mergeCells(0, 0, 2, 0); // 在合并后的单元格中央写入标题 WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD); WritableCellFormat titleFormat = new WritableCellFormat(titleFont);Format.setAlignment(jxl.format.Alignment.CENTRE); Label titleLabel = new Label(0, 0, "学生信息总表", titleFormat); sheet.addCell(titleLabel);
Q2: 如何设置单元格内容换行?
在创建 WritableCellFormat 后,使用 setWrap(true) 方法。
WritableCellFormat wrapFormat = new WritableCellFormat(); wrapFormat.setWrap(true); // 开启自动换行 Label noteLabel = new Label(0, 5, "这是一个很长很长的文本,需要自动换行显示。", wrapFormat); sheet.addCell(noteLabel);
Q3: jxl 的局限性是什么?
- 不支持
.xlsx格式:这是jxl最致命的缺点,现代 Office 版本默认使用.xlsx格式,用jxl生成的文件可能无法被正确识别或打开。 - 已停止更新:
jxl项目很久没有更新了,没有新功能,也没有对新版 Office 格式的支持。 - 性能问题:在处理大数据量(如数万行)时,性能可能不如其他更新的库。
Q4: 有没有更好的替代方案?
强烈推荐使用 Apache POI,它是目前 Java 操作 Excel 的事实标准。
- 支持格式:同时支持旧版
.xls和新版.xlsx。 - 功能强大:支持几乎所有 Excel 的功能,如图表、图片、复杂公式等。
- 社区活跃:持续更新和维护,遇到问题容易找到解决方案。
如果你需要开始一个新项目,或者现有项目需要支持 .xlsx 格式,请直接选择 Apache POI。
| 特性 | jxl (Java Excel API) | Apache POI |
|---|---|---|
| 支持格式 | 仅 .xls | .xls 和 .xlsx |
| 开发状态 | 停止更新 | 活跃开发 |
| API 复杂度 | 简单,易于上手 | 相对复杂,但更强大 |
| 推荐场景 | 遗留系统维护、简单的 .xls 导出 |
新项目、需要兼容新版 Office、功能复杂 |
希望这份详细的指南能帮助你掌握 jxl 的使用!
