杰瑞科技汇

java excel jxl 导出

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

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

准备工作:添加 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 文件,写入标题、数据、设置格式,并合并单元格。

java excel jxl 导出-图2
(图片来源网络,侵删)
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)的原因:

  1. 只支持 .xls 格式:不支持 Office 2007 及以后版本引入的 .xlsx 格式。
  2. 已停止维护jxl 项目已经很久没有更新了,这意味着它可能无法修复新发现的 bug,也不支持新特性。
  3. 功能相对有限:在处理复杂格式(如复杂图表、条件格式、数据透视表等)时能力不足。

替代方案: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
分享:
扫描分享到社交APP
上一篇
下一篇