vue 导出多级表头table 数据到excel

注意:在开始之前,先进行插件安装,参考:https://www.cnblogs.com/zhoulifeng/p/9974735.html

第二步:更改export2Excel.js里面的源码,本文示例为3级表头,可以根据需求,自行更改

//此处源码已被修改,autoWidt和bookType参数,先默认,(可以通过传参修改)

export function export_json_to_excel(excelData, autoWidth = true, bookType = 'xlsx') {

  /* original data */

  let multiHeader = excelData.multiHeader; // 第一级标题

  let multiHeader2 = excelData.multiHeader2; // 第二级标题

  let header = excelData.tHeader; // 第三级标题

  let data = excelData.transData; // table数据

  let defaultTitle = excelData.defaultTitle; // excel表的标题

  let merges = excelData.merges; // excel表合并单元格

  // console.log(multiHeader);

  // console.log(multiHeader2);

  // console.log(header);

  // console.log(data);

  // console.log(defaultTitle);

  // console.log(merges);

  data.unshift(header);

  //此处是第二行表头

  for (let i = multiHeader2.length - 1; i > -1; i--) {

    data.unshift(multiHeader2[i])

  }

  //此处是第一行行表头

  for (let i = multiHeader.length - 1; i > -1; i--) {

    data.unshift(multiHeader[i])

  }

  var ws_name = "SheetJS";

  var wb = new Workbook(),

    ws = sheet_from_array_of_arrays(data);

  //合并excel单元格和设置表格宽度

  if (merges.length > 0) {

    if (!ws['!merges']) ws['!merges'] = [];

    merges.forEach(item => {

      ws['!merges'].push(XLSX.utils.decode_range(item))

    })

  }

  if (autoWidth) {

    /*设置worksheet每列的最大宽度*/

    const colWidth = data.map(row => row.map(val => {

      /*先判断是否为null/undefined*/

      if (val == null) {

        return {

          'wch': 10

        };

      }

      /*再判断是否为中文*/

      else if (val.toString().charCodeAt(0) > 255) {

        return {

          'wch': val.toString().length * 2

        };

      } else {

        return {

          'wch': val.toString().length

        };

      }

    }))

    /*以第一行为初始值*/

    let result = colWidth[0];

    for (let i = 1; i < colWidth.length; i++) {

      for (let j = 0; j < colWidth[i].length; j++) {

        if (result[j]['wch'] < colWidth[i][j]['wch']) {

          result[j]['wch'] = colWidth[i][j]['wch'];

        }

      }

    }

    ws['!cols'] = result;

  }

  //--------------------------------------------------------

  /* add worksheet to workbook */

  wb.SheetNames.push(ws_name);

  wb.Sheets[ws_name] = ws;

  var wbout = XLSX.write(wb, {

    bookType: 'xlsx',

    bookSST: false,

    type: 'binary'

  });

  var title = defaultTitle || '列表'

  saveAs(new Blob([s2ab(wbout)], {

    type: "application/octet-stream"

  }), title + ".xlsx")

}



第三步:元素,及页面method里添加的方法


<Button type="success" style="margin-right:5px;" @click="exportmulti">导出</Button>

exportmulti() {

      import("@/exportExcel/Export2Excel2").then(excel => {

        const multiHeader = [

          [

            "企业名称",

            "电子收费金额",

            "",

            "",

            "",

            "应退款金额",

            "",

            "",

            "",

            "",

            "",

            "",

            "",

            "",

            "电子收费资金明细分类",

            "",

            "",

            "",

            "",

            "",

            "",

            "",

            ""

          ]

        ];

        const multiHeader2 = [

          [

            "",

            "微信公众商户平台",

            "微信开放商户平台",

            "支付宝",

            "合计",

            "2016.9.1前",

            "",

            "2016.9.1-2017.12.31",

            "",

            "2018.1.1-2019.12.31",

            "",

            "2020.1.1后",

            "",

            "合计",

            "2016.9.1前",

            "",

            "2016.9.1-2017.12.31",

            "",

            "2018.1.1-2019.12.31",

            "",

            "实收",

            "",

            "合计"

          ]

        ];

        const tHeader = [

          "",

          "",

          "",

          "",

          "",

          "微信",

          "支付宝",

          "微信",

          "支付宝",

          "微信",

          "支付宝",

          "微信",

          "支付宝",

          "",

          "微信",

          "支付宝",

          "微信",

          "支付宝",

          "微信",

          "支付宝",

          "微信",

          "支付宝",

          ""

        ];

        // table对应导入字段

        const filterVal = [

          "companyName",

          "eWeChatMountApp",

          "eWeChatMountApp",

          "eAlipay",

          "eTotal",

          "reWeChatBefore",

          "reAlipayBefore",

          "reWeChatBe",

          "reAlipayBe",

          "reWeChatTe",

          "reAlipayTe",

          "reWeChatAf",

          "reAlipayAf",

          "reTotal",

          "deWeChatBefore",

          "deAlipayBefore",

          "deWeChatBe",

          "deAlipayBe",

          "deWeChatTe",

          "deAlipayTe",

          "deWeChatAf",

          "deAlipayAf",

          "deTotal"

        ];

        let list = this.capitalStatementData;

        // table数据转换

        const data = this.formatJson(filterVal, list);

        //进行所有表头的单元格合并,建议一行一行来,不然容易整乱

        const merges = [

          "A1:A3",

          "B1:E1",

          "B2:B3",

          "C2:C3",

          "D2:D3",

          "E2:E3",

          "F1:N1",

          "F2:G2",

          "H2:I2",

          "J2:K2",

          "L2:M2",

          "N2:N3",

          "O1:W1",

          "O2:P2",

          "Q2:R2",

          "S2:T2",

          "U2:V2",

          "W2:W3"

        ];

        // 导出excel表,的标题

        const defaultTitle = "各企业资金统计";

        // 按照顺序传参

        excel.export_json_to_excel({

          multiHeader, //这里是第一行的表头

          multiHeader2, //这里是第二行的表头

          tHeader, //这里应该是算第三行的表头

          data, // 表格数据

          defaultTitle, // excel表的名称

          merges // 合并excel单元格

        });

      });

    },

    /* 转换table数据,以便正确导出数据

    -------------------------------------------------------------------*/

    formatJson(filterVal, jsonData) {

      return jsonData.map(v =>

        filterVal.map(j => {

          if (j !== "companyName") {

            return parseTime(v[j]);

          } else {

            return v[j];

          }

        })

      );

    },

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342