杰瑞科技汇

java jxl读取excel

jxl 是一个比较老牌且经典的 Java 操作 Excel 的库,它支持 .xls 格式(Excel 97-2003)。它不支持 .xlsx 格式,对于现代的 .xlsx 文件,你应该使用更现代的库,Apache POI。

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

准备工作:添加 JXL 依赖

你需要在你的项目中添加 jxl 的依赖,如果你使用 Maven,请在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version> <!-- 这是最常用的稳定版本 -->
</dependency>

如果你不使用 Maven,可以手动下载 jxl.jar 文件,并将其添加到你的项目的类路径(Classpath)中。


JXL 读取 Excel 的核心步骤

使用 JXL 读取 Excel 文件的基本流程如下:

  1. 获取工作簿对象 (Workbook):通过文件路径或输入流打开 Excel 文件,得到一个 Workbook 对象。
  2. 获取工作表对象 (Sheet):从 Workbook 对象中,根据索引(从 0 开始)或名称获取你需要读取的工作表。
  3. 获取单元格对象 (Cell):遍历工作表的行和列,获取每个单元格的 Cell 对象。
  4. 读取单元格数据:根据单元格的数据类型(数字、字符串、日期等),使用相应的方法(如 getContents()getNumber() 等)获取数据。
  5. 关闭资源:关闭 Workbook 对象以释放资源。

完整代码示例

假设我们有一个名为 test.xls 的 Excel 文件,内容如下:

java jxl读取excel-图2
(图片来源网络,侵删)
姓名 年龄 入职日期 薪资
张三 28 2025-05-20 50
李四 32 2025-11-01 00
王五 25 2025-09-15 00

下面是一个完整的 Java 程序,用于读取这个 test.xls 文件并打印其内容。

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
public class JxlReadExample {
    public static void main(String[] args) {
        // 1. 定义要读取的Excel文件路径
        String excelFilePath = "test.xls";
        try {
            // 2. 获取工作簿对象
            // 注意:Workbook.getWorkbook() 方法会抛出 BiffException 和 IOException
            Workbook workbook = Workbook.getWorkbook(new File(excelFilePath));
            // 3. 获取第一个工作表(索引从0开始)
            Sheet sheet = workbook.getSheet(0);
            // 4. 遍历工作表的每一行和每一个单元格
            // sheet.getRows() 获取总行数
            // sheet.getColumns() 获取总列数
            for (int i = 0; i < sheet.getRows(); i++) {
                for (int j = 0; j < sheet.getColumns(); j++) {
                    // 获取单元格对象
                    Cell cell = sheet.getCell(j, i);
                    // 获取单元格内容(通用方法,返回字符串)
                    String cellContent = cell.getContents();
                    // 为了格式化输出,可以加上制表符
                    System.out.print(cellContent + "\t");
                }
                // 每行打印完后换行
                System.out.println();
            }
            // 5. 关闭工作簿,释放资源
            workbook.close();
        } catch (IOException e) {
            System.err.println("文件读取或IO异常: " + e.getMessage());
            e.printStackTrace();
        } catch (BiffException e) {
            System.err.println("Excel文件格式错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

输出结果:

姓名  年龄  入职日期    薪资  
张三  28  2025-05-20  8500.5  
李四  32  2025-11-01  12000.0 
王五  25  2025-09-15  7500.0  

更精细的数据类型读取

上面的例子中,cell.getContents() 总是返回 String 类型,如果我们想获取特定格式的数据(如数字、日期),需要先判断单元格的类型。

jxl 提供了 Cell 的子类来表示不同类型的单元格:

java jxl读取excel-图3
(图片来源网络,侵删)
  • Label: 字符串类型
  • Number: 数字类型
  • Date: 日期类型

我们可以使用 Cell.getType() 方法来判断单元格类型。

import jxl.Cell;
import jxl.DateCell;
import jxl.LabelCell;
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;
public class JxlReadWithTypesExample {
    public static void main(String[] args) {
        String excelFilePath = "test.xls";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        try {
            Workbook workbook = Workbook.getWorkbook(new File(excelFilePath));
            Sheet sheet = workbook.getSheet(0);
            // 跳过表头,从第二行开始读取数据
            for (int i = 1; i < sheet.getRows(); i++) {
                // 读取姓名 (字符串)
                Cell nameCell = sheet.getCell(0, i);
                String name = ((LabelCell) nameCell).getString();
                // 读取年龄 (数字)
                Cell ageCell = sheet.getCell(1, i);
                int age = (int) ((NumberCell) ageCell).getValue();
                // 读取入职日期 (日期)
                Cell dateCell = sheet.getCell(2, i);
                java.util.Date hireDate = ((DateCell) dateCell).getDate();
                String formattedDate = dateFormat.format(hireDate);
                // 读取薪资 (数字)
                Cell salaryCell = sheet.getCell(3, i);
                double salary = ((NumberCell) salaryCell).getValue();
                // 打印格式化后的数据
                System.out.println("姓名: " + name + ", 年龄: " + age + 
                                   ", 入职日期: " + formattedDate + 
                                   ", 薪资: " + salary);
            }
            workbook.close();
        } catch (IOException | BiffException e) {
            e.printStackTrace();
        }
    }
}

输出结果:

姓名: 张三, 年龄: 28, 入职日期: 2025年05月20日, 薪资: 8500.5
姓名: 李四, 年龄: 32, 入职日期: 2025年11月01日, 薪资: 12000.0
姓名: 王五, 年龄: 25, 入职日期: 2025年09月15日, 薪资: 7500.0

JXL 的主要优点和缺点

优点

  1. 轻量级:API 简单直观,学习成本低。
  2. 占用内存小:相比于 Apache POI,jxl 在处理大文件时内存占用更少。
  3. 性能较好:对于 .xls 文件的读写,速度表现不错。

缺点

  1. 不支持 .xlsx 格式:这是它最大的硬伤,现代 Excel 文件基本都是 .xlsx 格式。
  2. 停止更新jxl 项目已经停止更新多年,没有后续维护和 bug 修复。
  3. 功能有限:不支持复杂的功能,如 Excel 公式、图表、宏等。
  4. 仅支持读:虽然 jxl 也支持写,但其写入功能远不如 Apache POI 强大和灵活。

总结与建议

特性 JXL Apache POI (推荐)
支持格式 .xls .xls.xlsx
开发状态 已停止更新 活跃开发,社区强大
功能 基础读写 功能极其强大(公式、图表、样式等)
内存占用 较低 较高,但有 SAX 模式优化
易用性 非常简单 相对复杂,但文档齐全
  • 如果你只需要处理非常老的 .xls 文件,且项目对依赖库的大小和更新频率没有要求,可以考虑使用 jxl
  • 对于任何新项目,强烈推荐使用 Apache POI,它是目前 Java 操作 Excel 事实上的标准,功能全面、社区活跃、持续更新,能够满足绝大多数场景的需求。
分享:
扫描分享到社交APP
上一篇
下一篇