杰瑞科技汇

java jxl导出excel

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

java jxl导出excel-图1
(图片来源网络,侵删)

环境准备

你需要在你的 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 包:

  1. 访问 Maven 中央仓库:https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl
  2. 找到 6.12 版本,下载 jxl.jar 文件。
  3. 将下载的 JAR 文件添加到你的项目的 classpath 中。

核心 API 概念

在使用 jxl 之前,了解几个核心类和接口非常重要:

  • WritableWorkbook: 代表一个可写入的 Excel 工作簿,在写入数据前,必须先创建这个对象。
  • WritableSheet: 代表工作簿中的一个工作表(Sheet),你可以创建多个 Sheet。
  • Label: 代表 Excel 中的一个单元格,且单元格内容为字符串类型。
  • Number: 代表 Excel 中的一个单元格,且单元格内容为数字类型。
  • DateTime: 代表 Excel 中的一个单元格,且单元格内容为日期类型。
  • jxl.write.WritableFontjxl.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();
        }
    }
}

代码解析

  1. Workbook.createWorkbook(new File(filePath)): 这是导出的起点,它会创建一个指向指定文件路径的 WritableWorkbook 对象,如果文件已存在,它将被覆盖
  2. writableWorkbook.createSheet(...): 在工作簿中创建一个新的工作表。
  3. sheet.setColumnView(...): 调整列的宽度,让表格更美观。
  4. WritableFontWritableCellFormat: 这是 jxl 实现样式的核心,我们先定义字体(如加粗),然后用字体创建单元格格式,并设置对齐方式、背景色等。
  5. new Label(...), new Number(...), new DateTime(...): 根据数据类型创建不同的单元格对象。
    • Label: 用于文本。
    • Number: 用于整数或小数。
    • DateTime: 用于日期类型。
  6. sheet.addCell(...): 将创建好的单元格对象添加到工作表的指定位置(行和列)。
  7. writableWorkbook.write()writableWorkbook.close(): 这两个步骤是必须的! write() 方法将所有在内存中构建的 Excel 内容写入到磁盘文件中,close() 则会释放资源并关闭工作簿,顺序不能错。

常见问题与注意事项

Q1: 如何合并单元格?

使用 WritableSheetmergeCells(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 的局限性是什么?

  1. 不支持 .xlsx 格式:这是 jxl 最致命的缺点,现代 Office 版本默认使用 .xlsx 格式,用 jxl 生成的文件可能无法被正确识别或打开。
  2. 已停止更新jxl 项目很久没有更新了,没有新功能,也没有对新版 Office 格式的支持。
  3. 性能问题:在处理大数据量(如数万行)时,性能可能不如其他更新的库。

Q4: 有没有更好的替代方案?

强烈推荐使用 Apache POI,它是目前 Java 操作 Excel 的事实标准。

  • 支持格式:同时支持旧版 .xls 和新版 .xlsx
  • 功能强大:支持几乎所有 Excel 的功能,如图表、图片、复杂公式等。
  • 社区活跃:持续更新和维护,遇到问题容易找到解决方案。

如果你需要开始一个新项目,或者现有项目需要支持 .xlsx 格式,请直接选择 Apache POI


特性 jxl (Java Excel API) Apache POI
支持格式 仅 .xls .xls 和 .xlsx
开发状态 停止更新 活跃开发
API 复杂度 简单,易于上手 相对复杂,但更强大
推荐场景 遗留系统维护、简单的 .xls 导出 新项目、需要兼容新版 Office、功能复杂

希望这份详细的指南能帮助你掌握 jxl 的使用!

分享:
扫描分享到社交APP
上一篇
下一篇