Vue中使用XLSX做前端导出(可导Echarts和table表格)

一、table表格导出

**简单表格复杂合并表格都支持一键导出**

1、安装依赖:npm install xlsx file-saver -S

2、在需要导出功能的页面组件中引入

import FileSaver from "file-saver";
import XLSX from "xlsx";

3、Dom层,给需要导出的table标签el-table 或者a-table上加一个id:如outTable,对应下面的exportExcel方法中的 document.querySelector(‘#outTable‘)

 <a-table
          :columns="columns"
          :data-source="data"
          id="outTable"
          :pagination="false"
          bordered
          :scroll="{ x: 1700, y: 340 }"
        >
</a-table>

4、methods里面写方法:

exportExcel() {
      var xlsxParam = { raw: true };//转换成excel时,使用原始的格式
      var wb = XLSX.utils.table_to_book(document.querySelector("#outTable"),xlsxParam);//outTable为列表id
      var wbout = XLSX.write(wb, {
        bookType: "xlsx",
        bookSST: true,
        type: "array"
      });
      try {
        FileSaver.saveAs(
          new Blob([wbout], { type: "application/octet-stream;charset=utf-8" }),
          "各储能电站运行收益周报表.xlsx"
        );
      } catch (e) {
        if (typeof console !== "undefined") console.log(e, wbout);
      }
      return wbout;}

5、导出后的结果


image.png

踩坑记录:如果是fiexd固定列的table 直接用上面的方法会导致加了fiexd的列在表格多绘制一次,如下所示:

image.png

解决方案:此时我们只需找到加了fiexd的列 在导出前去除fiexd或者fiexd为false即可

image.png
columns:[
        {
          title: "序号",
          customRender: function (text, record, index) {
            return index + 1;
          },
          width: 70,
          fixed: "left",
          align: "center",
        },
        {
          title: "站点名称",
          dataIndex: "stationName",
          width: 100,
          fixed: "left",
          align: "center",
        },
        {
          title: "周充电成本(元)",
          children: [
            {
              title: "尖",
              dataIndex: "inSharpPrice",
              align: "center",
              width: 100,
            },
        ......
        //此处结构省略
]

由上图和columns结构得知前两列加了 fixed: "left",我们改造下导出方法如下

exportExcel() {
    //有几列这里就改几列
      this.columns[0].fixed = false
      this.columns[1].fixed = false
      setTimeout(() => {
          var xlsxParam = { raw: true };//转换成excel时,使用原始的格式
          var wb = XLSX.utils.table_to_book(document.querySelector("#outTable"),xlsxParam);//outTable为列表id
          var wbout = XLSX.write(wb, {
            bookType: "xlsx",
            bookSST: true,
            type: "array"
          });
          try {
            FileSaver.saveAs(
              new Blob([wbout], { type: "application/octet-stream;charset=utf-8" }),
              "各储能电站运行收益周报表.xlsx"
            );
          } catch (e) {
            if (typeof console !== "undefined") console.log(e, wbout);
         }
        //定位还原
        this.columns[0].fixed = "left"
        this.columns[1].fixed = "left"
          return wbout;}
       })
    

二、echarts导出

1、安装依赖:npm install xlsx --save

2、在需要导出功能的页面组件中引入

import XLSX from "xlsx";

3、重组数据,要导出echarts图表的数据只需要将数据结构重组成以下格式,通过数组导出excel

    var data = [

        ["id", "time", "value"],

        [1, "2022-06-07", 666.8],

        [2, "2022-06-08", 888.7]

      ];
      const ws= XLSX.utils.aoa_to_sheet(data);

      /* generate workbook and add the worksheet */
      const wb = XLSX.utils.book_new();
      XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

      /* save to file */
      XLSX.writeFile(wb, 'SheetJS.xlsx');

例子如下:
echarts如图所示:

image.png

接下来我们看下后端返回json结构

image.png
image.png

如图所示我们需要遍历data和pointList拿到时间和每个电池簇对应的value值,做法如下:

plugins文件夹下封装xlsxFile.js

export default {
    /**
     * xlsx导出
     * @param {*} XLSX 核心api
     * @param {*} filename 文件名称
     * @param {object} data 数据源{key: Array}
     */
    xlsxFile(XLSX, filename, data) {
        // 创建workbook对象
        const wb = XLSX.utils.book_new();
        // 将srcData转换为worksheet
        for (let key in data) {
            const ws = XLSX.utils.aoa_to_sheet(data[key]);
            // worksheet 加入workbook
            XLSX.utils.book_append_sheet(wb, ws, key);
        }
        // 导出
        XLSX.writeFile(wb, `${filename}.xlsx`);
    }
};

页面引入

import * as XLSX from "xlsx";
import exportFile from "@/plugins/xlsxFile";

method:exportExce导出重组数据

exportExcel() {
            let th = ["时间"],
                max = 0;
            // 表头
            for (let item of this.chartData) {
                th.push(item.deviceName);
                if (item.pointList.length > max) max = item.pointList.length;
            }
            // 内容区
            let content = [];
            for (let i = 0; i < max; i++) {
                let row = [];
                for (let item of this.chartData) {
                    row.push(item.pointList[i].value);
                }
                row.unshift(this.chartData[0].pointList[i].time);
                content.push(row);
            }
            exportFile.xlsxFile(XLSX, "组电压", {
                组电压导出一览: [th, ...content],
            });
        },

导出结果


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

推荐阅读更多精彩内容