Vue实现Excel预览性能

前言:

我的项目中常常能遇到要求预览excel文件的需要,上面分享一下罕用的办法以及可能遇到的问题。

应用场景:

通过解析excel性能,实现PDF导入时的预览

首先咱们用到了XLSX(sheetJs)这个库来解决Excel类型的文件

地址:

https://docs.sheetjs.com/

https://www.npmjs.com/package/xlsx

反对大部分的古代浏览器版本

具体应用:

下载: npm i xlsx

首先咱们获取一Excel类型的文件。

这里我间接用了el-upload组件返回的文件

而后应用FileReader读取文件,注册初始化onload办法,并且在其onload办法中应用xlsx库解决文件;

  • 首先应用xlsx的read办法,配置解决的详情。
    const workbook = XLSX.read(data, {      type: "binary",      cellText: false,      cellDates: true,    });
  • 再轮询读取文件
    for (let sheet in workbook.Sheets) {      //循环读取每个文件      const header = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {        header: 1,      });      const sheetArray = XLSX.utils.sheet_to_json(        workbook.Sheets[sheet],        // 配置单元的数据转换方法,dateNF不失效        { raw: true, cellDates: true, dateNF: "yyyy/mm/dd" }      );      //若以后sheet没有数据,则continue      if (sheetArray.length == 0) {        continue;      }      this.tableHeader = header[0];      this.handleNetX(sheetArray, header[0]);    }  } catch (e) {    this.$message.warning("上传失败");  }

留神sheet_to_json办法中此时cellDates配置为true之后,如果excel文件内的数据类型为工夫,会被转成Date格局。

官网文档中容许配置dateNF来进行工夫格式化,然而理论应用起来并没有成果。

所以针对工夫格局的解决,笔者这里间接转为Date格局,在后续过程中进行了手动解决。

咱们初始化load办法后,将excel文件源文件,转为bolb格局,在塞给fileReader.readAsBinaryString,进行文件解决办法的执行。

      const blob = new Blob([file.raw]);      fileReader.readAsBinaryString(blob);

最初轮询sheetArray来进行数据的二次解决,最初失去前端能够应用的Array类型的文件,展现在页面中或者展现在表单中。

工夫格局解决

解决工夫的办法写的比较简单,次要就是判断了Date的object类型,来格式化日期类型

    handleNetX(sheetArray, header) {      const totalTable = [];      for (let index in sheetArray) {        let row = {};        header.map(index1 => {          const tempKey = this.mapTableTitle[index1];          if (typeof sheetArray[index][index1] === "object") {            row[tempKey] = this.handleExcelDate(sheetArray[index][index1]);          } else {            row[tempKey] = sheetArray[index][index1];          }        });        totalTable.push(row);      }      this.tableData = totalTable;    },    handleExcelDate(date) {      if (!date) {        return;      }      return formatDate(date.getTime(), "YYYY/MM/DD");    },

代码总结:

    async handleChangePre(file) {      this.file = file;      this.showResult = false;      const fileReader = new FileReader();      fileReader.onload = ev => {        try {          const data = ev.target.result;          const workbook = XLSX.read(data, {            type: "binary",            cellText: false,            cellDates: true,          });          for (let sheet in workbook.Sheets) {            //循环读取每个文件            const header = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {              header: 1,            });            const sheetArray = XLSX.utils.sheet_to_json(              workbook.Sheets[sheet],              { raw: true, cellDates: true, dateNF: "yyyy/mm/dd" }            );            //若以后sheet没有数据,则continue            if (sheetArray.length == 0) {              continue;            }            this.tableHeader = header[0];            console.log(sheetArray, "sheetArray");            this.handleNetX(sheetArray, header[0]);          }        } catch (e) {          this.$message.warning("上传失败");        }      };      const blob = new Blob([file.raw]);      fileReader.readAsBinaryString(blob);    },