node xlxs,xls文件导入

node xlxs,xls文件导入

//开头引入
/**
 const awaitWriteStream = require("await-stream-ready").write; //异步二进制 写入流
 const fs = require("fs"); //node.js 文件操作对象
 const path = require("path"); //node.js 路径操作对象
 const xlsx = require("xlsx");
*/
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); //通过工具将表对象的数据读出来并转成json
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]]
       });
    }
//listData 就是数据数组
}
    // 信息导入-文件流获取、文件存放本地
    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;
        // 拼成url路径
        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,
        };
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值