ExcelJS:Excel 檔案處理完整指南
備註
本文基於 ExcelJS v4 版本撰寫。
為什麼選擇 ExcelJS?
前情提要
在 Node.js 生態系中,處理 Excel 檔案的套件主要就是 xlsx 和 exceljs 這兩個。我過往接觸的專案中大部分是使用 xlsx,不過最近公司專案在做弱掃的時候,掃出了 xlsx(SheetJS)這個套件有安全漏洞需要修復。查了一下才發現 xlsx 已經四年沒有在 npm 上更新了,一直停留在 0.18 版,而修復漏洞的版本是 0.19 以上,但這個版本只能到 SheetJS 官方的 GitHub 上取得,不再提供 npm 安裝。既然 xlsx 已經不再維護 npm 版本,那 exceljs 自然就成了首選。實際用下來,發現 exceljs 有幾個不錯的地方:
- 持續維護:在 npm 上持續更新,社群也還算活躍
- 樣式支援完整:字型、顏色、邊框、填充、對齊這些樣式設定都有支援,這點比 xlsx 的免費版本好很多
- 可以插入圖片:如果報表需要放 logo 或圖表截圖,這個功能就很實用
- 支援串流處理:處理大檔案的時候可以用串流 API,不會一次把整個檔案載入記憶體
- 有 TypeScript 型別定義:開發體驗比較好
基本概念:Excel 的結構
在開始寫 code 之前,必須先了解一下 Excel 檔案的結構以及名詞定義,因為 ExcelJS 的 API 設計就是照著這個結構來的。
Excel 檔案的層級結構
打開一個 Excel 檔案會看到:
- 整個檔案就是一個 Workbook(活頁簿)
- 下方有很多分頁標籤,每個標籤就是一個 Worksheet(工作表)
- 每個工作表裡面是一個表格,橫的叫 Row(列),直的叫 Column(欄)
- 列跟欄的交叉點就是 Cell(儲存格)
用圖來表示的話大概是這樣:
ExcelJS 的操作流程
了解結構之後,用 ExcelJS 產生 Excel 檔案的流程大概是這樣:
Workbook(活頁簿)
Workbook 就是整個 Excel 檔案,所有操作都要從建立 Workbook 開始。
建立 Workbook
const workbook = new ExcelJS.Workbook();
設定檔案屬性
可以設定一 些 metadata,這些資訊會出現在 Excel 的「檔案 → 資訊」裡面:
workbook.creator = 'Bosh';
workbook.lastModifiedBy = 'Bosh';
workbook.created = new Date(2024, 11, 1);
workbook.modified = new Date();
Workbook 屬性一覽
| 屬性 | 型別 | 說明 |
|---|---|---|
creator | string | 建立者名稱 |
lastModifiedBy | string | 最後修改者名稱 |
created | Date | 建立時間 |
modified | Date |