node xlxs,xls文件导入
async upload({ctx}){
let parameter = await this.test(ctx);
let thead = [
parameter.sheet.A1.v,
parameter.sheet.B1.v
]
const data = xlsx.utils.sheet_to_json(parameter.sheet);
let theadRule = [
"名称",
"地址"
]
const isValid = thead.every((value, index) => value === theadRule[index]);
if (!isValid) return '上传文件格式错误,表格表头字段不一致!'
let listData = [];
for (let i = 0; i < data.length; i++) {
listData.push({
Name: data[i][thead[0]],
Address: data[i][thead[1]]
});
}
}
async test(ctx) {
const stream = await ctx.getFileStream();
const fileExt = stream.filename.substr(stream.filename.lastIndexOf("."));
let split = stream.filename.split(".")[0];
let baseDir = this.config.OilFileDir;
let filename =
split +
"_" +
ctx.helper.dataFormat(new Date(), "yyyyMMddhhmmss") +
"_" +
Math.floor(Math.random() * 10000 + 1000) +
"_" +
fileExt;
const url = path.join(baseDir, "OilFile/");
if (!fs.existsSync(url)) {
url.split(path.sep).reduce((currentPath, folder) => {
currentPath += folder + path.sep;
if (!fs.existsSync(currentPath)) {
fs.mkdirSync(currentPath, {
recursive: true,
});
}
return currentPath;
}, "");
}
let savepath = path.join(url, filename);
const writeStream = fs.createWriteStream(savepath, {
encoding: "utf-8",
});
await awaitWriteStream(stream.pipe(writeStream));
const workbook = xlsx.readFile(savepath);
const sheetNames = workbook.SheetNames;
const sheet = workbook.Sheets[sheetNames[0]];
if (fileExt != ".xlsx" && fileExt != ".xls") {
return {
msg: "上传文件错误,文件后缀应为 .xlsx 或者 .xls!",
};
}
return {
success: true,
sheet: sheet,
stream: stream,
};
}