簡述需求
我們在用Excel表格的時候經常需要合併數據,比如統計整個年級的數據的時候,需要合併每個班成績的時候,這就需要一個快速將很多張數據類型相同表合併的組件
需要的配置
- 現在Node.js能夠很好進行文件的讀寫操作,只要能讀寫就能合併
- 社區已經有了封裝好的一些插件比如node-xlsx,cnpm install就能用
- 引入Node本來的文件讀寫工具
const xlsx = require('node-xlsx')
const fs = require('fs')
獲取文件決定路徑,定義合併數組
我們將文件放到excle裏,而合併的結果放到result裏
const _file = `${__dirname}/excel/`
const _output = `${__dirname}/result/`
let dataList = [
{
name: '提交成績',//你sheet的名字
data: []
}]
讀出數據
fs.readdir(_file, function(err, files) {}裏可以將所有_file讀出來放到files數組裏
解析數據
let excelData = xlsx.parse(`${_file}${item}`)//拼接的絕對路徑
console.log(excelData)
console.log(excelData[0].data)
提取數據進行拼接
files.forEach((item, index) => {
try {
console.log(`開始合併:${item}`)
let excelData = xlsx.parse(`${_file}${item}`)
if (excelData) {
if (dataList[0].data.length > 0) {
excelData[0].data.splice(0, 1)
}
dataList[0].data = dataList[0].data.concat(excelData[0].data)
}
} catch (e) {
console.log('excel表格內部字段不一致,請檢查後再合併。')
}
})
寫入新的文件
var buffer = xlsx.build(dataList)
fs.writeFile(`${_output}resut.${new Date().getTime()}.xlsx`, buffer, function (err) {
if (err) {
throw err
}
console.log('\x1B[33m%s\x1b[0m', `完成合並:${_output}resut.${new Date().getTime()}.xlsx`)
})
完整代碼
const xlsx = require('node-xlsx')
const fs = require('fs')
// excel文件夾路徑(把要合併的文件放在excel文件夾內)
const _file = `${__dirname}/excel/`
const _output = `${__dirname}/result/`
let dataList = [
{
name: '提交成績',
data: []
}]
init()
function init () {
fs.readdir(_file, function(err, files) {
console.log(files)
if (err) {
throw err
}
files.forEach((item, index) => {
try {
console.log(`開始合併:${item}`)
let excelData = xlsx.parse(`${_file}${item}`)
if (excelData) {
if (dataList[0].data.length > 0) {
excelData[0].data.splice(0, 1)
}
dataList[0].data = dataList[0].data.concat(excelData[0].data)
}
} catch (e) {
console.log('excel表格內部字段不一致,請檢查後再合併。')
}
})
var buffer = xlsx.build(dataList)
fs.writeFile(`${_output}resut.${new Date().getTime()}.xlsx`, buffer, function (err) {
if (err) {
throw err
}
console.log('\x1B[33m%s\x1b[0m', `完成合並:${_output}resut.${new Date().getTime()}.xlsx`)
})
})
}