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

Java 操作 Excel 完全指南:JExcelApi 與 Apache POI 兩大主流方案對比實戰

     編輯:Java 綜合教學

Java 讀寫 Excel 兩大陣營:JExcelApi (jxl) 輕量 vs Apache POI (HSSF/XSSF) 功能全

導出報表、導入數據是企業級應用標配。本文對比 JExcelApi(僅支援 .xls)與 Apache POI(支援 .xls/.xlsx、功能豐富)的核心 API、樣式處理、大數據流式寫入、常見坑點,助你選型落地。

一、JExcelApi (jxl.jar) —— 輕量、簡單、僅 .xls

核心類層級

Workbook (頂層)
├── Sheet (工作表)
│   ├── Cell (單元格)
│   │   ├── Label (字符串)
│   │   ├── Number (數字)
│   │   ├── DateTime (日期)
│   │   └── Formula (公式)
│   └── 合併單元格、行高列寬設置
└── 格式化:WritableFont + WritableCellFormat

關鍵代碼片段

// 1. 創建可寫工作簿
WritableWorkbook wwb = Workbook.createWorkbook(new File("report.xls"));
WritableSheet sheet = wwb.createSheet("Sheet1", 0);

// 2. 樣式:字體、對齊、邊框、背景色
WritableFont font = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLUE);
WritableCellFormat headerFormat = new WritableCellFormat(font);
headerFormat.setAlignment(Alignment.CENTRE);
headerFormat.setBackground(Colour.GRAY_25);
headerFormat.setBorder(Border.ALL, BorderLineStyle.THIN);

// 3. 寫入標題(合併單元格)
sheet.mergeCells(0, 0, 4, 0); // A1:E1
Label title = new Label(0, 0, "2024 年銷售報表", headerFormat);
sheet.addCell(title);

// 4. 寫入數據行
for (int i = 0; i < dataList.size(); i++) {
    SaleRecord r = dataList.get(i);
    sheet.addCell(new Label(0, i+1, r.getProduct()));
    sheet.addCell(new Number(1, i+1, r.getQty()));
    sheet.addCell(new Number(2, i+1, r.getAmount()));
    // 日期格式
    WritableCellFormat dateFmt = new WritableCellFormat(new DateFormat("yyyy-MM-dd"));
    sheet.addCell(new DateTime(3, i+1, r.getSaleDate(), dateFmt));
}

// 5. 設置列寬
sheet.setColumnView(0, 30); // 第 0 列寬 30 字符

// 6. 寫入磁盤並關閉
wwb.write();
wwb.close();

讀取 .xls

Workbook rb = Workbook.getWorkbook(new File("report.xls"));
Sheet sheet = rb.getSheet(0);
for (int i = 1; i < sheet.getRows(); i++) { // 跳過標題行
    String product = sheet.getCell(0, i).getContents();
    double qty = Double.parseDouble(sheet.getCell(1, i).getContents());
    // ...
}
rb.close();

二、Apache POI (HSSF .xls / XSSF .xlsx) —— 功能全、支援大文件、主流選擇

核心類層級

Workbook (介面)
├── HSSFWorkbook (.xls) / XSSFWorkbook (.xlsx)
├── Sheet
│   ├── Row
│   │   ├── Cell
│   │   │   ├── CellStyle (樣式)
│   │   │   ├── DataFormat (數據格式)
│   │   │   └── Font (字體)
│   └── 合併區域、行/列分組、凍結窗格、圖片、圖表、數據驗證
└── SXSSFWorkbook (流式寫入,低內存)

樣式處理差異:POI 樣式需從 Workbook 創建,不可 new

// 1. 創建樣式(從 Workbook 獲取)
CellStyle headerStyle = workbook.createCellStyle();
Font headerFont = workbook.createFont();
headerFont.setBold(true);
headerFont.setColor(IndexedColors.WHITE.getIndex());
headerFont.setFontHeightInPoints((short) 12);
headerStyle.setFont(headerFont);
headerStyle.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex());
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headerStyle.setAlignment(HorizontalAlignment.CENTER);
headerStyle.setBorderBottom(BorderStyle.THIN);

// 2. 日期格式
CellStyle dateStyle = workbook.createCellStyle();
DataFormat fmt = workbook.createDataFormat();
dateStyle.setDataFormat(fmt.getFormat("yyyy-MM-dd"));

// 3. 應用樣式
Cell cell = row.createCell(0);
cell.setCellValue("標題");
cell.setCellStyle(headerStyle);

大數據導出:SXSSFWorkbook (流式,只保留最近 N 行內存)

// 保留最近 100 行內存,其餘刷盤到臨時文件
try (SXSSFWorkbook wb = new SXSSFWorkbook(100)) {
    Sheet sheet = wb.createSheet("BigData");
    // 正常創建 Row/Cell/Style,API 與 XSSF 一致
    for (int i = 0; i < 1_000_000; i++) {
        Row row = sheet.createRow(i);
        row.createCell(0).setCellValue("Row-" + i);
        // ...
    }
    try (FileOutputStream out = new FileOutputStream("big.xlsx")) {
        wb.write(out); // 一次性寫入磁盤
    }
} // 自動清理臨時文件

三、方案對比與選型建議

維度JExcelApi (jxl)Apache POI
文件格式僅 .xls (BIFF8).xls (HSSF) + .xlsx (XSSF/SXSSF)
JAR 體積~300 KB~3 MB (poi + poi-ooxml + xmlbeans)
功能豐富度基礎讀寫、樣式、合併全功能:圖表、樞紐表、數據驗證、宏、簽名、加密
大文件支援❌ 全量內存✅ SXSSF 流式寫入、SAX 事件式讀取
性能小文件較快大文件優勢明顯
維護狀態停止更新 (最後 2009)活躍維護 (Apache 項目)
推薦場景舊項目維護、極簡導出、受限環境**新項目首選**、複雜報表、大數據、.xlsx 需求

四、常見坑點與避雷指南

  1. POI 樣式復用:CellStyle、Font、DataFormat **必須從 Workbook 創建**,全局複用,不可在循環中重複創建(會導致樣式表溢出,拋 IllegalStateException: The maximum number of Cell Styles was exceeded)
  2. 數字儲存為文本:cell.setCellValue("123") 會存成字符串,導致 Excel 提示「數字儲存為文本」,請用 cell.setCellValue(123) 或 cell.setCellType(CellType.NUMERIC)
  3. 日期格式:Excel 日期本質是數字,需同時設置 cell.setCellValue(date) + cellStyle.setDataFormat(fmt.getFormat("yyyy-MM-dd"))
  4. 列寬單位:POI sheet.setColumnWidth(col, 256 * 20) 單位為 1/256 字符寬度,JXL sheet.setColumnView(col, 20) 直接用字符數
  5. 資源關閉:Workbook 實現 Closeable,**必須 try-with-resources** 關閉,否則臨時文件殘留、文件句柄洩漏

五、總結

  • 新項目**首選 Apache POI**,支援 .xlsx、功能全、社區活躍
  • 大數據導出**必用 SXSSFWorkbook**,指定窗口行數(如 100)控制內存
  • 樣式對象**從 Workbook 創建並復用**,避免樣式表溢出
  • 讀取未知格式文件可用 WorkbookFactory.create(inputStream) 自動識別 .xls/.xlsx
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved