前言
- 用node做伺服器端表格處理時,需要使用excel處理模組,網上能搜到的外掛大概就三四種(xlsx,excel-export,node-xlsx等),經過我的使用,發現最強大,api最全面的就是exceljs。
然而因為其官方文件十分簡潔(陋),初起時使用過程並不那麼順利,這裡結合自己的經驗,對exceljs模組及其基本用法進行簡單介紹,對一些自己遇到的坑進行總結。
一、安裝及引入模組
npm install exceljs
使用npm命令安裝之後,在所需要的檔案中引入exceljs模組:
var Excel = require(`exceljs`);
二、建立工作簿及工作表
- 引入之後,我們就可以直接通過js建立工作簿,注意:建立工作表之前必須建立工作簿。
var workbook = new Excel.Workbook();
- 工作簿有很多屬性可以設定,比如建立人、修改時間等一般用不上的資訊,一般不需要設定,如果你有特殊需要,那麼請參照下述設定即可:
workbook.creator = `WJY`;
//設定建立者workbook.lastModifiedBy = `Her`;
//上次修改人workbook.created = new Date(1985, 8, 30);
//建立時間workbook.modified = new Date();
//修改時間
更多詳細的關於建立工作簿的屬性設定請[參考官方][1]。
- 建立工作簿之後,需要為工作簿新增工作表,用來存放我們的資料:
var sheet = workbook.addWorksheet(`My Sheet`);
- 通常這樣建立就夠了,但是也可以設定建立的工作表的屬性:
// 建立標籤為紅色的表格
var sheet = workbook.addWorksheet(`My Sheet`, {properties:{tabColor:{argb:`FFC0000`}}});
// 建立網格線隱藏的表格
var sheet = workbook.addWorksheet(`My Sheet`, {properties: {showGridLines: false}});
// 建立第一行第一列凍結的表格
var sheet = workbook.addWorksheet(`My Sheet`, {views:[{xSplit: 1, ySplit:1}]});
三、表格填充(資料寫入)
- 在寫入資料之前,要指定使用的工作表,可以像下面這樣操作:
// 通過表格名字(建立時的`My Sheet`)
var worksheet = workbook.getWorksheet(`My Sheet`);
// 通過表格順序數(id),即第幾張表格,這裡注意,exceljs不是從0開始計算,而是1。
var worksheet = workbook.getWorksheet(1);
- 拿到工作表之後,可以通過兩種方式將表格內容生成:
1.worksheet.getCell(`A1`).value = `value`;
這種方式較為靈活,可填寫任意位置的表格,利用迴圈巢狀等方式可生成想要的表格。
合併單元格使用: worksheet.mergeCells(`I2:J2`);
此時合併了I2 J2兩個單元格。
2.如果資料是物件陣列data=[{name:`a`},{name:`b`},{name:`c`}],也就是資料格式良好,有固定的鍵值對,那麼推薦這種方式:
先定好表頭
worksheet.columns = [
{ header: `姓名`, key: `name`, width: 10 },
];
header:引數即為在表頭裡出現的值,key表示這列的值對應的物件的key(本例為name),width為表格列寬。
設定表頭之後,使用addrow方法即可將資料寫入表中,如下:
for(let i =0;i<data.length;i++){
worksheet.addRow(data[i]);
}
四、生成xlsx檔案
var filename=`test.xlsx`;//生成的檔名
fpath=path.join(__dirname,`../download/`+filename)//檔案存放路徑
workbook.xlsx.writeFile(fpath)//將workbook生成檔案
.then(function() {
//檔案生成成功後執行的操作,這裡是將路徑返回客戶端,你可以有自己的操作
res.send({filePath:filename})
});
總結、
有時候我們資料格式良好,但需要實現自定義表頭(表頭有合併單元格、多級表頭等),這時該怎麼辦呢?
混合使用 worksheet.mergeCells()
及worksheet.getCell().value
設定表頭,之後使用
worksheet.columns = [
{ key: `name`, width: 10 },
];
注意:這裡沒有header的key,如果有,將會覆蓋我們的自定義表頭內容。
後續正常呼叫
for(let i =0;i<data.length;i++){
worksheet.addRow(data[i]);
}
即可。
更多資料參閱官方文件
如有問題可留言,互相交流解決。