You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.3 KiB
82 lines
2.3 KiB
'use strict';
|
|
const fs = require('fs');
|
|
const xlsx = require('better-xlsx');
|
|
const path = require('path')
|
|
const moment = require('moment')
|
|
|
|
|
|
module.exports = function (app, opts) {
|
|
|
|
//递归创建目录 同步方法
|
|
async function makeDir (dir) {
|
|
if (!fs.existsSync(dir)) {
|
|
makeDir(path.dirname(dir))
|
|
fs.mkdirSync(dir, function (err) {
|
|
if (err) {
|
|
throw err
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
async function simpleExcelDown ({ data = [], header = [], fileName = moment().format('YYYY-MM-DD HH:mm:ss') } = {}) {
|
|
const fileDirPath = path.join(__dirname, `../../downloadFiles`)
|
|
makeDir(fileDirPath)
|
|
const file = new xlsx.File();
|
|
const sheet_1 = file.addSheet('sheet_1');
|
|
|
|
// header
|
|
const headerStyle = new xlsx.Style();
|
|
headerStyle.align.h = 'center';
|
|
headerStyle.align.v = 'center';
|
|
headerStyle.border.right = 'thin';
|
|
headerStyle.border.rightColor = '#000000';
|
|
headerStyle.border.bottom = 'thin';
|
|
headerStyle.border.bottomColor = '#000000';
|
|
|
|
const headerRow = sheet_1.addRow();
|
|
const indexCell = headerRow.addCell();
|
|
indexCell.value = '序号'
|
|
indexCell.style = headerStyle
|
|
for (let h of header) {
|
|
const cell = headerRow.addCell();
|
|
cell.value = h.title;
|
|
cell.style = headerStyle
|
|
}
|
|
|
|
// data
|
|
const style = new xlsx.Style();
|
|
style.align.h = 'left';
|
|
style.align.v = 'center';
|
|
style.border.right = 'thin';
|
|
style.border.rightColor = '#000000';
|
|
style.border.bottom = 'thin';
|
|
style.border.bottomColor = '#000000';
|
|
for (let i = 0; i < data.length; i++) {
|
|
const row = sheet_1.addRow();
|
|
const indexCell = row.addCell();
|
|
indexCell.value = i + 1
|
|
indexCell.style = headerStyle
|
|
for (let h of header) {
|
|
const cell = row.addCell();
|
|
cell.value = data[i][h.key] || h.defaultValue || '-';
|
|
cell.style = style
|
|
}
|
|
}
|
|
|
|
const savePath = path.join(fileDirPath, fileName)
|
|
await new Promise(function (resolve, reject) {
|
|
file.saveAs()
|
|
.pipe(fs.createWriteStream(savePath))
|
|
.on('finish', () => {
|
|
resolve()
|
|
});
|
|
})
|
|
return savePath
|
|
}
|
|
|
|
return {
|
|
simpleExcelDown,
|
|
makeDir
|
|
}
|
|
}
|