node表格模組exceljs介紹1–基本使用

懶懶的技術宅發表於2019-02-16

前言

  • 用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]);
    }

即可。
更多資料參閱官方文件
如有問題可留言,互相交流解決。

相關文章