杰瑞科技汇

Java Excel导入jxl如何实现?

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

Java Excel导入jxl如何实现?-图1
(图片来源网络,侵删)

如果你需要维护旧项目或处理 .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 包下。

Java Excel导入jxl如何实现?-图2
(图片来源网络,侵删)
类名 作用
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());
        }
    }
}

代码解析

  1. File excelFile = new File("data.xls"); 创建一个 File 对象,指向你的 Excel 文件,请确保路径正确。

  2. Workbook workbook = Workbook.getWorkbook(excelFile); 这是核心步骤。Workbook.getWorkbook() 方法会打开并读取整个 Excel 文件,返回一个 Workbook 对象,这个方法会加载整个文件到内存,所以对于非常大的文件要小心。

    Java Excel导入jxl如何实现?-图3
    (图片来源网络,侵删)
  3. Sheet sheet = workbook.getSheet(0); 从工作簿中获取第一个工作表,索引从 0 开始。

  4. sheet.getRows()sheet.getColumns() 获取工作表的总行数和总列数。

  5. 双层 for 循环 通过行和列的索引遍历所有单元格。

  6. sheet.getCell(j, i) 根据列索引 j 和行索引 i 获取一个 Cell 对象。

  7. 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();
        }
    }
}

代码解析

  1. CellType cellType = cell.getType(); 获取单元格的类型。

  2. if (cellType == CellType.NUMBER) 判断是否为数字类型,如果是,我们将 Cell 强制转换为 NumberCell,然后调用 getValue() 获取其 double 值。

  3. if (cellType == CellType.DATE) 判断是否为日期类型,如果是,我们将 Cell 强制转换为 DateCell,然后调用 getDate() 获取其 java.util.Date 对象,最后用 SimpleDateFormat 格式化为我们想要的字符串。


第五步:jxl 的优缺点总结

优点

  1. API 简单易用:对于简单的读写操作,API 非常直观。
  2. 轻量级:相比于 Apache POI,jxl 的库文件较小。
  3. 性能较好:对于 .xls 文件,读取速度通常不错。

缺点

  1. 不支持 .xlsx 格式:这是最致命的缺点,导致它无法在现代办公环境中使用。
  2. 已停止维护jxl 项目已经多年没有更新,没有新功能,也没有官方支持。
  3. 功能有限:不支持图表、图片、复杂公式等高级特性。
  4. 内存消耗大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)

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