jxl (Java Excel API) 是一个轻量级、纯 Java 的库,专门用于操作 Excel 文件(.xls 格式),它非常易于使用,是 Java 导出 Excel 的经典选择之一。

准备工作:添加 JXL 依赖
你需要在你的项目中添加 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'
JXL 核心概念
在开始编码前,先了解几个核心类:
WritableWorkbook: 代表一个可写入的 Excel 工作簿,在写入 Excel 文件时,你必须先创建这个对象。WritableSheet: 代表工作簿中的一个工作表,你可以从一个WritableWorkbook中创建或获取工作表。Label: 代表工作表中的一个字符串单元格。Number: 代表工作表中的一个数字单元格。DateTime: 代表工作表中的一个日期/时间单元格。WritableCellFormat: 用于设置单元格的格式,如字体、颜色、对齐方式等。
完整示例代码
下面是一个完整的、可运行的 Java 示例,演示了如何创建一个 Excel 文件,写入标题、数据、设置格式,并合并单元格。

import jxl.*;
import jxl.write.*;
import jxl.write.Number;
import jxl.format.*;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class JxlExportExample {
public static void main(String[] args) {
// 1. 定义要导出的文件路径
String excelFilePath = "D:/temp/data_export.xls";
try {
// 2. 创建或覆盖一个可写入的工作簿
// 第一个参数是文件路径,第二个参数表示如果文件存在是否覆盖
WritableWorkbook workbook = Workbook.createWorkbook(new File(excelFilePath));
// 3. 创建一个名为 "用户数据" 的工作表
// 参数:工作表索引 (0表示第一个), 工作表名称
WritableSheet sheet = workbook.createSheet("用户数据", 0);
// 4. 设置单元格样式(字体、加粗、背景色)
WritableFont font = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD);
WritableCellFormat headerFormat = new WritableCellFormat(font);
headerFormat.setBackground(Colour.LIGHT_BLUE); // 设置背景色为浅蓝色
headerFormat.setAlignment(Alignment.CENTRE); // 设置居中对齐
// 5. 写入表头
Label labelId = new Label(0, 0, "ID", headerFormat);
Label labelName = new Label(1, 0, "姓名", headerFormat);
Label labelAge = new Label(2, 0, "年龄", headerFormat);
Label labelJoinDate = new Label(3, 0, "入职日期", headerFormat);
sheet.addCell(labelId);
sheet.addCell(labelName);
sheet.addCell(labelAge);
sheet.addCell(labelJoinDate);
// 6. 写入数据行
// 第一行数据
sheet.addCell(new Number(0, 1, 1));
sheet.addCell(new Label(1, 1, "张三"));
sheet.addCell(new Number(2, 1, 28));
sheet.addCell(new DateTime(3, 1, new Date()));
// 第二行数据
sheet.addCell(new Number(0, 2, 2));
sheet.addCell(new Label(1, 2, "李四"));
sheet.addCell(new Number(2, 2, 32));
sheet.addCell(new DateTime(3, 2, new Date()));
// 第三行数据
sheet.addCell(new Number(0, 3, 3));
sheet.addCell(new Label(1, 3, "王五"));
sheet.addCell(new Number(2, 3, 25));
sheet.addCell(new DateTime(3, 3, new Date()));
// 7. 合并单元格 (从第0列第0行到第3列第0行)
sheet.mergeCells(0, 0, 3, 0);
Label mergedLabel = new Label(0, 0, "员工信息总表", headerFormat);
sheet.addCell(mergedLabel);
// 8. 调整列宽 (自动调整或手动设置)
// 方法一:手动设置列宽
sheet.setColumnView(0, 5); // 设置第0列的宽度为5个字符宽度
sheet.setColumnView(1, 10);
sheet.setColumnView(2, 5);
sheet.setColumnView(3, 15);
// 9. 将所有写入操作写入到文件中,并关闭工作簿
workbook.write();
workbook.close();
System.out.println("Excel 文件导出成功!路径: " + excelFilePath);
} catch (IOException e) {
System.err.println("文件写入失败,IO异常: " + e.getMessage());
e.printStackTrace();
} catch (WriteException e) {
System.err.println("Excel 写入失败,格式错误: " + e.getMessage());
e.printStackTrace();
}
}
}
代码分步详解
第1步:创建工作簿 (WritableWorkbook)
WritableWorkbook workbook = Workbook.createWorkbook(new File(excelFilePath));
这行代码是导出操作的开始,它会根据你提供的文件路径创建一个 .xls 文件,如果文件已存在,它会被覆盖。
第2步:创建工作表 (WritableSheet)
WritableSheet sheet = workbook.createSheet("用户数据", 0);
一个 Excel 文件可以包含多个工作表,这里我们创建了一个名为 "用户数据" 的工作表,并将其放在索引 0 的位置。
第3步:创建单元格格式 (WritableCellFormat)
为了美化表格,我们通常会设置表头的样式。
WritableFont font = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD); WritableCellFormat headerFormat = new WritableCellFormat(font); headerFormat.setBackground(Colour.LIGHT_BLUE); headerFormat.setAlignment(Alignment.CENTRE);
WritableFont: 定义字体(如ARIAL)、大小(12)和样式(BOLD加粗)。WritableCellFormat: 应用字体和其他格式,如背景色 (setBackground) 和对齐方式 (setAlignment)。
第4步:写入数据
根据数据类型选择不同的 WritableCell 子类:
- 字符串: 使用
new Label(列索引, 行索引, "内容")。sheet.addCell(new Label(1, 1, "张三"));
- 数字: 使用
new Number(列索引, 行索引, 数值)。sheet.addCell(new Number(0, 1, 1));
- 日期: 使用
new DateTime(列索引, 行索引, Date对象)。sheet.addCell(new DateTime(3, 1, new Date()));
第5步:合并单元格
sheet.mergeCells(起始列, 起始行, 结束列, 结束行);
这个方法可以将一个矩形区域内的单元格合并成一个,合并后,你只需要在起始位置写入内容即可。
第6步:调整列宽
sheet.setColumnView(列索引, 宽度);
手动设置列宽,宽度单位是字符数,你也可以使用 sheet.setColumnView(列索引) 来让 JXL 自动计算并调整列宽。
第7步:保存并关闭
workbook.write(); // 将内存中的写入操作同步到磁盘文件 workbook.close(); // 关闭工作簿,释放资源
非常重要:这两步操作是必不可少的。write() 负责写入,close() 负责关闭资源,确保文件完整性。
JXL 的局限性
虽然 jxl 很简单易用,但它也有一些明显的缺点,这也是为什么现在很多项目转向其他库(如 Apache POI)的原因:
- 只支持
.xls格式:不支持 Office 2007 及以后版本引入的.xlsx格式。 - 已停止维护:
jxl项目已经很久没有更新了,这意味着它可能无法修复新发现的 bug,也不支持新特性。 - 功能相对有限:在处理复杂格式(如复杂图表、条件格式、数据透视表等)时能力不足。
替代方案:Apache POI
如果你的项目需要支持 .xlsx 格式或者需要更强大的功能,强烈推荐使用 Apache POI。
Apache POI 的优势:
- 支持广泛:同时支持
.xls(HSSF) 和.xlsx(XSSF) 格式。 - 功能强大:几乎可以操作 Excel 的所有元素。
- 社区活跃:持续维护和更新,文档和示例丰富。
使用 POI 导出 Excel 的简单示例:
// 添加 POI 依赖 (对于 .xlsx 格式,通常使用 xlsx 模块)
// <dependency>
// <groupId>org.apache.poi</groupId>
// <artifactId>poi-ooxml</artifactId>
// <version>5.2.3</version>
// </dependency>
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class PoiExportExample {
public static void main(String[] args) throws IOException {
String excelFilePath = "D:/temp/data_export_poi.xlsx";
// 1. 创建一个新的 XSSFWorkbook 对象 (对应 .xlsx)
Workbook workbook = new XSSFWorkbook();
// 2. 创建一个工作表
Sheet sheet = workbook.createSheet("POI 示例");
// 3. 创建行和单元格
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("产品名称");
headerRow.createCell(2).setCellValue("价格");
Row dataRow1 = sheet.createRow(1);
dataRow1.createCell(0).setCellValue(101);
dataRow1.createCell(1).setCellValue("笔记本电脑");
dataRow1.createCell(2).setCellValue(5999.99);
// 4. 自动调整列宽
for (int i = 0; i < 3; i++) {
sheet.autoSizeColumn(i);
}
// 5. 写入文件并关闭
try (FileOutputStream fileOut = new FileOutputStream(excelFilePath)) {
workbook.write(fileOut);
}
workbook.close();
System.out.println("POI Excel 文件导出成功!路径: " + excelFilePath);
}
}
| 特性 | JXL | Apache POI |
|---|---|---|
| 文件格式 | 仅 .xls |
.xls (HSSF) 和 .xlsx (XSSF) |
| 维护状态 | 已停止 | 活跃维护 |
| 易用性 | 非常简单,API 直观 | 相对复杂,但更强大 |
| 功能 | 基础功能 | 功能全面,支持几乎所有 Excel 特性 |
| 适用场景 | 简单的、旧系统的 .xls 导出需求 |
新项目,需要支持新格式或复杂功能的场景 |
建议:
- 如果只是做一个简单的、一次性的
.xls导出,并且不想引入复杂的依赖,jxl是一个快速的选择。 - 对于任何新的、长期维护的项目,或者有
.xlsx格式需求的项目,请直接使用 Apache POI。
