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

Java 操作 Excel 實戰指南:基於 JExcelApi 的讀寫與修改

     編輯:Java 相關知識

前言

在 Windows 環境下,Excel 試算表幾乎是辦公自動化的代名詞。然而,若要用 Java 程式直接操控 Excel 檔案(.xls),卻非易事。早期 Web 應用常透過 JSP/Servlet 產生 CSV 並以 text/csv MIME 型別回傳,瀏覽器再呼叫 Excel 開啟。這雖能「檢視」資料,卻無法真正「操作」試算表(如格式化、公式、樣式等)。

本文介紹開源專案 Java Excel API (JExcelApi),讓 Java 開發者能以純 Java 程式碼,跨平台地讀取、建立、修改 Excel 97/2000 格式檔案,並支援字型、數字、日期格式、儲存格陰影與顏色等豐富功能。

一、JExcelApi 簡介

  • 開源、純 Java 實作,不依賴 Windows 或 Excel 安裝環境。
  • 支援讀取 Excel 95/97/2000 檔案、讀取公式(Excel 97 以上)、產生 Excel 97 格式活頁簿。
  • 提供字型、數字、日期格式化、儲存格陰影/顏色、修改現有活頁簿等功能。
  • 暫不支援圖表讀取、公式寫入(但可讀取公式計算結果)。

二、核心類別架構

  • Workbook:代表整個活頁簿(唯讀 jxl.Workbook、可寫 jxl.write.WritableWorkbook)。
  • Sheet:工作表(jxl.Sheet、jxl.write.WritableSheet)。
  • Cell:儲存格(jxl.Cell、jxl.write.WritableCell 及其子類別 Label、Number、DateTime、Boolean 等)。

三、讀取 Excel 檔案

1. 建立 Workbook

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

InputStream is = new FileInputStream("source.xls");
Workbook rwb = Workbook.getWorkbook(is); // 唯讀 Workbook

亦可直接用 Workbook.getWorkbook(new File("source.xls"))。

2. 取得 Sheet

Sheet rs = rwb.getSheet(0); // 索引從 0 開始
// 或依名稱:Sheet rs = rwb.getSheet("Sheet1");

3. 讀取 Cell 內容

Cell c00 = rs.getCell(0, 0); // (column, row)
String str = c00.getContents(); // 統一以字串取值

// 若需確切型別:
if (c00.getType() == CellType.LABEL) {
    LabelCell lc = (LabelCell) c00;
    String text = lc.getString();
} else if (c00.getType() == CellType.NUMBER) {
    NumberCell nc = (NumberCell) c00;
    double val = nc.getValue();
} else if (c00.getType() == CellType.DATE) {
    DateCell dc = (DateCell) c00;
    Date date = dc.getDate();
}

4. 常用 Workbook / Sheet 方法

類別方法說明
WorkbookgetNumberOfSheets()取得工作表數量
WorkbookgetSheets()取得所有 Sheet 陣列
WorkbookgetVersion()取得 API 版本
SheetgetName()取得工作表名稱
SheetgetColumns()取得總欄數
SheetgetRows()取得總列數
SheetgetColumn(int col)取得指定欄的所有 Cell 陣列
SheetgetRow(int row)取得指定列的所有 Cell 陣列
SheetgetCell(int col, int row)取得指定儲存格(注意參數順序:column, row)

5. 關閉資源

rwb.close(); // 釋放記憶體,讀取大量資料時尤為重要

四、建立新的 Excel 活頁簿

1. 建立可寫入的 Workbook

import jxl.write.*;

WritableWorkbook wwb = Workbook.createWorkbook(new File("target.xls"));
// 或寫入輸出串流(如 Servlet 輸出):
// OutputStream os = response.getOutputStream();
// WritableWorkbook wwb = Workbook.createWorkbook(os);

2. 建立 Sheet

WritableSheet ws = wwb.createSheet("Report", 0); // 名稱、索引

3. 新增儲存格(支援格式化)

// 純文字
ws.addCell(new Label(0, 0, "Hello"));

// 帶字型格式
WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableCellFormat wcf = new WritableCellFormat(wf);
ws.addCell(new Label(1, 0, "Styled", wcf));

// 紅色字體
WritableFont wfRed = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
    UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
ws.addCell(new Label(2, 0, "Red", new WritableCellFormat(wfRed)));

// 數值與格式
NumberFormat nf = new NumberFormat("#.##");
ws.addCell(new Number(0, 1, 3.1415926, new WritableCellFormat(nf)));

// 日期與格式
DateFormat df = new DateFormat("dd MMM yyyy HH:mm:ss");
ws.addCell(new DateTime(0, 2, new java.util.Date(), new WritableCellFormat(df)));

// 布林值
ws.addCell(new Boolean(0, 3, true));

注意:儲存格位置在建構時即固定(column, row,索引從 0 起),不可變更位置,只能修改內容。

4. 寫入並關閉

wwb.write(); // 將緩衝資料寫入檔案/串流
wwb.close(); // 釋放資源

務必先呼叫 write() 再 close(),否則會產生空白檔案。

五、修改現有 Excel 檔案(複製後寫入)

// 1. 讀取唯讀 Workbook
Workbook rb = Workbook.getWorkbook(new File("source.xls"));

// 2. 以其為基礎建立可寫入副本
WritableWorkbook wb = Workbook.createWorkbook(new File("target.xls"), rb);

// 3. 取得可寫入 Sheet 並修改
WritableSheet ws = wb.getSheet(0);
WritableCell wc = ws.getWritableCell(0, 0);
if (wc.getType() == CellType.LABEL) {
    ((Label) wc).setString("Updated Value");
}

// 4. 寫入並關閉(須關閉兩個 Workbook)
wb.write();
wb.close();
rb.close();

此機制為效率考量:讀取時忽略格式資訊,僅保留數值;修改時在記憶體中同時保留兩份副本,大檔案會佔用較多記憶體。

六、補充:Apache POI 簡例

文末亦附上 POI (HSSF) 建立 50x50 矩陣的範例,展示另一主流選擇。

結語

JExcelApi 以輕量、易用、跨平台特性,成為 Java 操作 Excel 97/2000 格式的經典方案。雖近年 Apache POI 支援更廣(含 .xlsx),JExcelApi 於維護舊系統、簡易報表產出仍具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved