會計老婆大人的前端小跟班兒——node 操作 Excel 表格

陸榮濤發表於2022-11-23

前言
我女朋友,是個會計, 她每天都要收拾兩樣東西,表格和我!通常情況下,她收拾不了表格,心情就會變差,隨後就會收拾我!按邏輯,表格就是我被收拾的罪魁禍首,那如果我搞定了表格······豈不是·······嘻嘻嘻

圖片

一個機會的出現"這裡有幾個表格, 你給我把幾個表格裡面的內容放在一個檔案裡面"

此時, 我已經意識到了, 她最近心情不好, 但是我又表現的比較好, 她沒什麼機會罵我

我知道, 這只是一個藉口, 我一定不能讓她得逞, 還好我有 "技術" O(∩_∩)O~接下來, 我就開始了我的操作.PS : 今天一定不能捱罵

準備工作
資料夾
a.xlsx : 有兩個表格頁
圖片.png
b.xlsx : 有一個表格頁
圖片.png

目標

把兩個 Excel 表格合併成一個
讀取兩個 Excel 表格的內容, 合併成一個, 寫入到一個新的 Excel 表格內

開始搞
下載第三方

$ npm install node-xlsx

// 匯入第三方
const xlsx = require('node-xlsx')

// 開始讀取 excel 檔案
// 測試讀取 a.xlsx 檔案
const workbook = xlsx.parse('./a.xlsx')

console.log(workbook)

接下來去命令列執行一下這個檔案試試看

$ node index.js

得到的結果是

[
  { name: '第一頁', data: [ [Array], [Array] ] },
  { name: '第二頁', data: [ [Array], [Array] ] }
]

我們發現, 把第一個 excel 表格的所有內容都讀取出來了

接下來詳細列印一下陣列內的內容

console.log(workbook[0].data)

再來看一下結果

[ [ '姓名', '性別', '年齡' ], [ '前端小灰狼', '男', 18 ] ]

我們發現, 當前這個表中的所有內容都出現了

如果我們只需要合併若干表格的話, 其實是不需要做多餘的操作的, 這個資料就可以使用

讀取兩個檔案並整合陣列

index.js

 // 匯入第三方
const xlsx = require('node-xlsx')

// 讀取第一個檔案
const workbook1 = xlsx.parse('./a.xlsx')
const workbook2 = xlsx.parse('./b.xlsx')

// 把兩個讀取到的檔案整合
const workbookResult = [ ...workbook1, ...workbook2 ]

console.log(workbookResult)

執行一下看看結果

[

  { name: '第一頁', data: [ [Array], [Array] ] },
  { name: '第二頁', data: [ [Array], [Array] ] },
  {
    name: '財務自由',
    data: [
      [Array], [Array],
      [Array], [Array],
      [Array], [Array],
      [Array]
    ]
  }
]

全部讀取出來了

如果我猜的沒錯, 那麼這個資料是不需要調整的, 只要按照這個格式再次寫入到一個 .xlsx 的檔案中就可以了

嘗試建立一個 Excel 表格

index.js

// 匯入第三方
const xlsx = require('node-xlsx')
const fs = require('fs')

// 準備要寫入的資料
//   這裡的一個 data 就是一個 Excel 檔案
const data = [
    //    每一個物件就是一個表格頁
    {
        //    name 屬性就是表格頁的名稱
        name: '測試',
        //    data 就是表格頁內的資料
        data: [
            //    每一個小陣列就是一行資料
            [ '姓名', '性別', '年齡' ], // 以這一行為表頭
            [ '前端小灰狼', '男', 18 ],
            [ '千鋒教育', '保密', 11 ]
        ]
    }
]

// 利用 xlsx 生成表格流檔案
const workboot = xlsx.build(data)

// 把生成好的內容寫入一個檔案
fs.writeFileSync('./test.xlsx', workboot) 

執行以後, 我們發現, 當前目錄下多了一個 test.xlsx 的檔案

圖片

透過寫入方式, 我們會發現, 讀取出來的內容是可以直接使用的

正式開始合併工作

OS : 我的工作馬上就要完成了, 看你怎麼罵我. 哼, 女人 !!

但是我這次完成以後, 如果讓她嚐到甜頭, 以後肯定還會讓我搞, 不如設計好, 以後就方便多了

圖片

準備一個目錄結構

- src
    + data     // 存放所有等待合併的 Excel 表格
    + index.js   // 邏輯檔案

開始程式碼
index.js

// 匯入第三方
const xlsx = require('node-xlsx')
const fs = require('fs')

// 裝備一個陣列用來整合所有內容
let list = []

// 利用 fs 讀取 data 資料夾路徑
const pathInfo = fs.readdirSync('./data/')

// 迴圈遍歷來生成
pathInfo.forEach(item => {
  // 排除掉不是 .xlsx 結尾的檔案
  if (!/\.xlsx$/.test(item)) return

  const res = xlsx.parse(`./data/${ item }`)
  list = [ ...list, ...res ]
})

// 生成要寫入的 表格流 檔案
const workboot = xlsx.build(list)

// 開始寫入
fs.writeFileSync('./result.xlsx', workboot)

完成, 以後在讓我合併表格這個事情就簡單多了

OS : 那她會不會還讓我做很多別的事情, 比如調整表格內容(合併單元格, 設定單元格大小, ...)

管她呢, 下次她有要求再說吧, 不能一次全都滿足她, 給自己留一點餘地

004.gif

工作結束
小灰狼: "老婆, 老婆, 我弄完了, 我厲害不厲害"
"為什麼這麼快"
小灰狼: "拿了橘子跑了"
"什麼?"
小灰狼: "knowledge is power,知識就是力量"
"你丫的有這好東西, 不早說,還跟我這兒拽洋文..."(媳婦兒,別打臉······)

相關文章