报错内容用标题标注了,excel编写为什么报错?

image.png

loadTableData(type) {
      return getStatementList({
        jurisdiction: this.condition.proflids,
        startDate: this.condition.startTime,
        endDate: this.condition.endTime,
        userId: this.$store.getters['user/userId'],
        condType:type,
        type:this.type,
      })
    },
    exportExcel(type) {
      // 获取导出xlsx名称
      const xlsx_title = '场外期权结算单.xlsx';
      let nameArr = ['资金汇总','资金明细', '期货持仓明细', '远期持仓明细', '期权交易明细', '远期交易明细'];
      Promise.all([this.loadTableData(0), this.loadTableData(1), this.loadTableData(2), this.loadTableData(3), this.loadTableData(4),this.loadTableData(5)]).then(res => {
        let wb = XLSX.utils.book_new();
        for (let i = 0; i < 6; i++) {
          // 获取table_dom
          let table = this.$refs['tabTable' + i].$refs.table;
          let tableData = res[i].data.list;
          if (type === 'page') {
            tableData = res[i].data.list.slice((this.page.pageNum - 1) * this.page.pageSize, this.page.pageNum * this.page.pageSize)
          }
          // 获取table单元格宽度和表头,表格数据进行筛选
          let table_header = [];
          let table_cell_min_width = [];
          let table_column_key = [];
          (table.columns || []).forEach(column => {
            if (column.type == "selection") {
              return;
            }
            table_header.push(column.label);
            table_cell_min_width.push({wpx: column.minWidth});
            table_column_key.push(column.property)
          })

          let index = 1;
          //处理表格数据
          let handelData = tableData.map((rowData, j) => {
            let handleRowData = {};
            handleRowData['index'] = index;
            index++;
            rowData.index = j + 1;

            table_column_key.forEach(item => {
              if (item) {
                handleRowData[item] = rowData[item] == null ? '' : rowData[item];
              }
            });
            return handleRowData;
          })

          // 将表格数据数组转换为工作表。
          const headerWs = XLSX.utils.aoa_to_sheet([table_header]);
          const new_sheet = XLSX.utils.sheet_add_json(headerWs, handelData, {skipHeader: true, origin: 'A2'});

          // 设置单元格宽度
          new_sheet['!cols'] = table_cell_min_width;

          //设置表头样式
          let style = {
            border: {
              bottom: {style: "thin", color: {rgb: "000000"}}, top: {style: "thin", color: {rgb: "000000"}},
              left: {style: "thin", color: {rgb: "000000"}}, right: {style: "thin", color: {rgb: "000000"}}
            },
            alignment: {horizontal: 'center', wrapText: true, vertical: "center"},
            font: {size: 12, bold: true, color: {rgb: "000000"}, italic: false, underline: false}
          };
          for (let j = 65; j < 65 + table_header.length; j++) {
#### *new_sheet[String.fromCharCode(j) + '1'].s = style;*
          }
          XLSX.utils.book_append_sheet(wb, new_sheet, nameArr[i]);
        }
        // 使用xlsx-style写入文件方式,使得自定义样式生效
        const tmpDown = new Blob([
          this.s2ab(
            XLSXStyle.write(wb, {
              bookType: "xlsx",
              bookSST: false,
              type: "binary",
              cellStyles: true,
            })
          ),
        ]);

        try {
          FileSaver.saveAs(new Blob([tmpDown], {type: 'application/octet-stream'}), xlsx_title);
        } catch (e) {
          if (typeof console !== 'undefined') console.log(e, tmpDown)
        }
      })
    },
    s2ab(s) {
      if (typeof ArrayBuffer !== "undefined") {
        const buf = new ArrayBuffer(s.length);
        const view = new Uint8Array(buf);
        for (let i = 0; i !== s.length; ++i) {
          view[i] = s.charCodeAt(i) & 0xff;
        }
        return buf;
      } else {
        const buf = new Array(s.length);
        for (let i = 0; i !== s.length; ++i) {
          buf[i] = s.charCodeAt(i) & 0xff;
        }
        return buf;
      }
    }
阅读 1.9k
2 个回答

image.png

圈出来的部分是 undefined,就抛空指针异常了。你自己把 new_sheet 先打印出来,看里面有你 String.fromCharCode(j) + '1' 这个属性吗?

P.S. 看上去本来就是没有的,也没见你上面赋值过。你应该是想初始化?那应该这么写:

new_sheet[String.fromCharCode(j) + '1'] = { s: style };

是给 new_sheet[String.fromCharCode(j) + '1'] 赋值,不是给 new_sheet[String.fromCharCode(j) + '1'].s 赋值。

if(new_sheet[String.fromCharCode(j) + '1']) {
  new_sheet[String.fromCharCode(j) + '1'].s = style;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题