在企業級應用開發中,以程式方式操作 Microsoft Office 文件是常見需求。本文整理三種主流方案:使用 Jacob 操作 Word、JExcelAPI 處理 Excel,並簡述 PDF 處理方向。
Jacob (Java-COM Bridge) 透過 COM 介面呼叫 Word 應用程式,功能強大但需在 Windows 環境執行。
import com.jacob.activeX.*;
import com.jacob.com.*;
public class WordBean extends java.awt.Panel {
private ActiveXComponent wordApp = null;
private Dispatch document = null;
// 啟動 Word,可選擇是否顯示視窗
public void openWord(boolean visible) {
if (wordApp == null) {
wordApp = new ActiveXComponent("Word.Application");
}
Dispatch.put(wordApp, "Visible", new Variant(visible));
}
// 建立新文件
public void createNewDocument() {
Dispatch documents = Dispatch.get(wordApp, "Documents").toDispatch();
document = Dispatch.call(documents, "Add").toDispatch();
}
// 插入文字於游標位置
public void insertText(String text) {
Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch();
Dispatch.put(selection, "Text", text);
}
// 另存新檔
public void saveAs(String filename) {
Dispatch.call(document, "SaveAs", filename);
}
// 列印文件
public void print() {
Dispatch.call(document, "PrintOut");
}
// 關閉文件(不儲存變更)
public void closeDocument() {
Dispatch.call(document, "Close", new Variant(0));
document = null;
}
// 完全退出 Word
public void quitWord() {
Dispatch.call(wordApp, "Quit");
wordApp = null;
document = null;
}
}
public class WordTest {
public static void main(String[] args) {
WordBean word = new WordBean();
word.openWord(true); // 顯示 Word 視窗
word.createNewDocument(); // 建立新文件
word.insertText("Hello World from Java!");
word.saveAs("C:\\test.doc"); // 儲存
word.closeDocument();
word.quitWord();
}
}
JExcelAPI (jxl) 為純 Java 實作,跨平台支援讀寫 .xls 格式(不支援 .xlsx)。
import java.io.*;
import jxl.*;
public class ExcelReader {
public static void readExcel(String filePath) {
try {
// 從檔案或輸入流建立唯讀 Workbook
Workbook workbook = Workbook.getWorkbook(new File(filePath));
// 取得第一個工作表
Sheet sheet = workbook.getSheet(0);
// 讀取儲存格內容
Cell cell = sheet.getCell(0, 0); // A1 儲存格
System.out.println("A1 值: " + cell.getContents());
System.out.println("A1 型別: " + cell.getType());
// 依型別取得精確值
if (cell.getType() == CellType.NUMBER) {
NumberCell numCell = (NumberCell) cell;
double value = numCell.getValue();
}
workbook.close(); // 釋放資源
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.*;
import jxl.*;
import jxl.write.*;
import jxl.format.*;
public class ExcelWriter {
public static void createExcel(String filePath) {
try {
// 建立可寫入 Workbook
WritableWorkbook workbook = Workbook.createWorkbook(new File(filePath));
WritableSheet sheet = workbook.createSheet("報表", 0);
// 1. 一般文字
sheet.addCell(new Label(0, 0, "產品名稱"));
sheet.addCell(new Label(1, 0, "價格"));
// 2. 帶格式文字(粗體、字體、顏色)
WritableFont boldFont = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD);
WritableCellFormat boldFormat = new WritableCellFormat(boldFont);
sheet.addCell(new Label(0, 1, "筆記型電腦", boldFormat));
WritableFont redFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, Colour.RED);
WritableCellFormat redFormat = new WritableCellFormat(redFont);
sheet.addCell(new Label(1, 1, "NT$ 45,000", redFormat));
// 3. 數值與格式化
NumberFormat priceFormat = new NumberFormat("#,##0.00");
WritableCellFormat numFormat = new WritableCellFormat(priceFormat);
sheet.addCell(new Number(1, 2, 45000.00, numFormat));
// 4. 日期時間
DateFormat dateFormat = new DateFormat("yyyy/MM/dd HH:mm:ss");
WritableCellFormat dateCellFormat = new WritableCellFormat(dateFormat);
sheet.addCell(new DateTime(0, 3, new java.util.Date(), dateCellFormat));
// 寫入磁碟並關閉
workbook.write();
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ExcelModifier {
public static void modifyExcel(String srcPath, String destPath) {
try {
// 開啟唯讀與可寫入兩個 Workbook
Workbook readOnly = Workbook.getWorkbook(new File(srcPath));
WritableWorkbook writable = Workbook.createWorkbook(new File(destPath), readOnly);
WritableSheet sheet = writable.getSheet(0);
WritableCell cell = sheet.getWritableCell(0, 0);
// 修改儲存格內容(保留原格式)
if (cell.getType() == CellType.LABEL) {
Label label = (Label) cell;
label.setString("已更新: " + label.getString());
}
writable.write();
writable.close();
readOnly.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
| 庫 | 支援格式 | 跨平台 | 授權 | 適用場景 |
|---|---|---|---|---|
| Jacob | .doc, .docx | 僅 Windows | LGPL | 需完整 Word 功能、郵件合併 |
| JExcelAPI | .xls | 是 | LGPL | 簡單 .xls 讀寫、舊系統相容 |
| Apache POI | .xls, .xlsx | 是 | Apache 2.0 | 現代 Excel 處理首選 |
| iText 7 | 是 | AGPL/商業 | 複雜 PDF 產生與操作 |