首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 讀取 Excel 文件實戰:基於 JXL 庫的完整指南

     編輯:Java 相關知識

Java 操作 Excel 從入門到實戰:JXL 庫讀取 .xls 文件完整教程

雖然 Apache POI 是目前主流選擇,但 JXL(jexcelapi)作為純 Java 實現、不依賴 Windows 環境、體積輕量的特性,在 Linux 服務器、嵌入式設備、舊系統維護等場景仍有獨特價值。本文詳細講解 JXL 讀取 Excel 核心 API 與實戰代碼。

環境準備

  1. 下載 jxl.jar:官方站點
  2. 加入項目 classpath(Maven/Gradle 手動安裝至本地倉庫)

JXL 核心對象模型

類職責關鍵方法
Workbook整個工作簿getWorkbook(File), getSheet(int), close()
Sheet單個工作表getCell(int col, int row), getRows(), getColumns()
Cell單個儲存格getContents(), getType(), getRow(), getColumn()

座標系統:(列, 行),均從 0 開始,列對應 x(水平),行對應 y(垂直)。合併儲存格以左上角座標為準。

完整讀取代碼範例

import java.io.File;
import jxl.*;

public class ExcelReaderDemo {
    public static void main(String[] args) {
        String filePath = "t.xls"; // 僅支援 .xls 格式
        
        try {
            // 1. 獲取 Workbook
            Workbook workbook = Workbook.getWorkbook(new File(filePath));
            
            // 2. 獲取第一個 Sheet(索引 0)
            Sheet sheet = workbook.getSheet(0);
            
            // 3. 讀取標題儲存格 (0,0)
            Cell titleCell = sheet.getCell(0, 0);
            System.out.println("標題:" + titleCell.getContents());
            
            // 4. 逐行讀取數據(假設第 0 行是標題,從第 1 行開始)
            int row = 1;
            while (true) {
                Cell cell0 = sheet.getCell(0, row); // 第 1 列
                Cell cell1 = sheet.getCell(1, row); // 第 2 列
                Cell cell2 = sheet.getCell(2, row); // 第 3 列
                
                // 遇到第一列為空視為結束
                if (cell0.getContents().isEmpty()) break;
                
                System.out.println(cell0.getContents() + "\t" + 
                                 cell1.getContents() + "\t" + 
                                 cell2.getContents());
                row++;
            }
            
            // 5. 關鍵:釋放資源
            workbook.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

進階:健壯的通用讀取工具類

import java.io.File;
import java.util.*;
import jxl.*;

public class JxlUtils {
    /**
     * 讀取 Excel 為 List<Map<String, String>>,首行作為標題
     */
    public static List<Map<String, String>> readSheet(File file, int sheetIndex) {
        List<Map<String, String>> result = new ArrayList<>();
        Workbook workbook = null;
        
        try {
            workbook = Workbook.getWorkbook(file);
            Sheet sheet = workbook.getSheet(sheetIndex);
            
            int cols = sheet.getColumns();
            int rows = sheet.getRows();
            
            if (rows == 0) return result;
            
            // 讀取標題行
            String[] headers = new String[cols];
            for (int c = 0; c < cols; c++) {
                headers[c] = sheet.getCell(c, 0).getContents().trim();
            }
            
            // 讀取數據行
            for (int r = 1; r < rows; r++) {
                Map<String, String> rowMap = new LinkedHashMap<>();
                boolean allEmpty = true;
                
                for (int c = 0; c < cols; c++) {
                    String value = sheet.getCell(c, r).getContents().trim();
                    rowMap.put(headers[c], value);
                    if (!value.isEmpty()) allEmpty = false;
                }
                
                if (allEmpty) continue; // 跳過全空行
                result.add(rowMap);
            }
            
        } catch (Exception e) {
            throw new RuntimeException("讀取 Excel 失敗: " + file.getName(), e);
        } finally {
            if (workbook != null) workbook.close();
        }
        
        return result;
    }
}

JXL 關鍵限制與遷移建議

限制影響替代方案
僅支援 .xls (BIFF 格式)無法讀取 .xlsx遷移至 Apache POI (支援 .xls/.xlsx)
不支援公式計算只能讀取公式結果值POI 提供 FormulaEvaluator
大文件記憶體佔用高全量載入內存POI SXSSF / EasyExcel 流式讀取
項目停止維護 (2012 年最後更新)無安全更新、無新特性生產環境強烈建議遷移 POI

遷移至 Apache POI 快速對照

// JXL
Workbook wb = Workbook.getWorkbook(file);
Sheet s = wb.getSheet(0);
String v = s.getCell(0,0).getContents();

// POI (HSSF - .xls)
Workbook wb = new HSSFWorkbook(new FileInputStream(file));
Sheet s = wb.getSheetAt(0);
String v = s.getRow(0).getCell(0).getStringCellValue();

// POI (XSSF - .xlsx)
Workbook wb = new XSSFWorkbook(file); // 或 FileInputStream
// 後續 API 相同
wb.close();

最佳實踐總結

  • 新項目首選 Apache POI或EasyExcel(阿里開源,超大文件友好)
  • 維護舊系統用 JXL 時,嚴格做 finally { workbook.close() } 防止句柄洩漏
  • 讀取前驗證文件格式、大小、結構,異常快速失敗
  • 日期/數字類型儲存格需用 DateCell/NumberCell 正確解析,避免 getContents() 格式問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved