# Node.js Excel,Zip,Email 開局大禮包
今天的開局大禮包,送給大家的是如何用node.js編輯excel,並壓縮成zip檔,可由email寄送出去。
const fs = require('fs')
const path = require('path') // 基本盤fs and path
const sgMail = require('@sendgrid/mail') // 大禮包三主角
const ExcelJS = require('exceljs')
const ZipAFolder = require('zip-a-folder')
由於最後要寄送email,但email無法直接寄送資料夾,所以我們要先創建一個資料夾在專案資料夾中,加入壓縮變成zip檔後再寄送。
創建名為excelFolder的資料夾
if(!fs.existsSync(`${__dirname}/excelFolder/`))可用拿判斷資料夾是否已經存在
再使用fs.mkdir(path.join(`${__dirname}/`, 'excelFolder'),創建資料夾。
if(!fs.existsSync(`${__dirname}/excelFolder/`)) {
fs.mkdir(path.join(`${__dirname}/`, 'excelFolder'), (err) => {
if (err) {
return console.error(err)
}
})
}
創建excel
const workbook = new ExcelJS.Workbook()
const worksheet = workbook.addWorksheet('My Sheet')
// 只使用最基本的功能,其它請參閱github
worksheet.columns = [ // excel的header
{ header: "年", key: "year", width: 10 },
{ header: "月", key: "month", width: 10 },
{ header: "日", key: "day", width: 10 }
}
worksheet.addRow({ //data 會對應worksheet.columns的key填入
year: '2021',
month: '11',
day: '26',
})
會得到如下圖的結果

將此excel存到剛剛創建的excelFolder資料夾中
workbook.xlsx.writeFile(`${__dirname}/excelFolder/excel.xlsx`)
// 可在excelFolder找到創建的excel.xlsx
將excelFolder資料夾壓縮成excelFolder.zip
await ZipAFolder.zip(`${__dirname}/excelFolder`, `${__dirname}/excelFolder.zip`)
最後寄送email,需要把email附件轉成base64格式,使用 fs.readFileSync('path').toString("base64")
將生成的base64放到sgMail物件裡的attachments的content,type設定為"application/zip"
const pathToAttachment = `${__dirname}/excelFolder.zip`
const attachment = fs.readFileSync(pathToAttachment).toString("base64") // 轉成base64
await sgMail.send({
to: 'aaa@mail',
from: {
email: '寄件者mail',
name: '寄件者名稱'
},
bcc: ['cc@mail'],
subject: `主旨`,
text: '內文',
attachments: [
{
content: attachment,
filename: `excelFolder.zip`,
type: "application/zip",
disposition: "attachment"
}
]
}).catch(err => context.log(err))
將三大禮包整合處理後,就完成今天的任務了!