vue3.0 选项式 导出el-table数据到excel文件、多sheet页导出、自定义样式导出

9 篇文章 0 订阅

第一步:安装两个依赖包 npm install --save xlsx file-saver

第二:在你的页面中添加引用

import FileSaver from "file-saver";

import XLSX from "xlsx";

第三步:导出两个tab面板中的数据

 导出方法:   baseTable、alarmTable 与图中的保持一致 

exportExcel1() {

      var workbook = XLSX.utils.book_new();

      /* convert table 'table1' to worksheet named "Sheet1" */

      var ws1 = XLSX.utils.table_to_sheet(document.querySelector('#baseTable'));

      XLSX.utils.book_append_sheet(workbook, ws1, "历史数据");



      /* convert table 'table2' to worksheet named "Sheet2" */

      var ws2 = XLSX.utils.table_to_sheet(document.querySelector('#alarmTable'));

      XLSX.utils.book_append_sheet(workbook, ws2, "报警数据");



      /* get binary string as output */

      var wbOut = XLSX.write(workbook, {

        bookType: "xlsx",

        bookSST: true,

        type: "array"

      });

      try {

        FileSaver.saveAs(

          new Blob([wbOut], { type: "application/octet-stream" }),

          "数据查询.xlsx"

        );

      } catch (e) {

        if (typeof console !== "undefined") console.log(e, wbOut);

      }

      return wbout;

    },

以上导出的缺陷就是,只支持导出当前页面的数据,不能导出全部数据,另外导出到文件后xlsx格式不能自定义。

下面说一下自定义样式、及全部数据导出,直接贴代码:    

exportExcel() {

      var that = this;

      //要导出历史数据标题

      var arry = [['排灌站', '设备名称', '运行时长(分钟)', '开启时间', '关闭时间']];

      // 要导出的历史数据

      that.exportData.map(a => {

        var _arry = [];

        _arry.push(a.pumpstationName.toString());

        _arry.push(a.itemName.toString());

        _arry.push(a.runtime_Minute.toString());

        _arry.push(a.startTime == null ? "" : this.$moment(a.startTime).format("YYYY-MM-DD HH:mm:ss"));  //格式化日期没有就返回空

        _arry.push(a.endTime == null ? "" : this.$moment(a.endTime).format('YYYY-MM-DD HH:mm:ss'));  //格式化日期没有就返回空

        return _arry;

      }).forEach(a => {

        arry.push(a);

      });

      //要导出的报警数据标题

      var alarmInfoArry = [['排灌站', '预警类型', '当前值', '阈值']];

      // 要导出的报警数据

      that.alarmInfo.map(b => {

        var _alarmInfoArry = [];

        _alarmInfoArry.push(b.pumpName.toString());

        _alarmInfoArry.push(b.alarmType.toString());

        _alarmInfoArry.push(b.cuurentValue.toString());

        _alarmInfoArry.push(b.thresholdValue.toString());

        return _alarmInfoArry;

      }).forEach(b => {

        alarmInfoArry.push(b);

      });

      var sheetHistory = XLSX.utils.aoa_to_sheet(arry);//历史数据sheet

      var sheetAlarm = XLSX.utils.aoa_to_sheet(alarmInfoArry);//报警数据sheet

      var workbook = XLSX.utils.book_new();

      XLSX.utils.book_append_sheet(workbook, sheetHistory, "历史数据");

      XLSX.utils.book_append_sheet(workbook, sheetAlarm, "报警数据");

      //循环历史数据单元格设置样式

      var s = sheetHistory['!ref'];

      sheetHistory.s = {

        font: {

          name: '宋体',

          sz: 18,

          color: { rgb: "#FFFF0000" },

          bold: true,

          italic: false,

          underline: false

        },

        alignment: {

          horizontal: "center",

          vertical: "center"

        }

      };

      var rows = s.substr(s.length - 1, 1);

      var cloums = ['A', 'B', 'C', 'D', 'E'];

      for (var j = 0; j < cloums.length; j++) {

        for (var i = 1; i <= rows; i++) {

          if (i == 1) {

            sheetHistory[cloums[j] + i].s = { //样式  

              font: {

                bold: true,

                italic: false,

                underline: false

              },

              alignment: {

                horizontal: "left",

                vertical: "left",

                wrap_text: false

              }

            };

          }

          else {

            sheetHistory[cloums[j] + i].s = { //样式  

              alignment: {

                horizontal: "left",

                vertical: "left",

                wrap_text: false

              }

            };

          }

        }

      }

      sheetHistory["!cols"] = [{ wpx: 150 }, { wpx: 90 }, { wpx: 150 }, { wpx: 150 }, { wpx: 180 }]; //单元格列宽   



      //循环设置报警数据单元格样式

      var styleAlarm = sheetAlarm['!ref'];

      sheetAlarm.styleAlarm = {

        font: {

          name: '宋体',

          sz: 18,

          color: { rgb: "#FFFF0000" },

          bold: true,

          italic: false,

          underline: false

        },

        alignment: {

          horizontal: "center",

          vertical: "center"

        }

      };

      var rows2 = styleAlarm.substr(styleAlarm.length - 1, 1);

      var cloums2 = ['A', 'B', 'C', 'D'];

      for (var k = 0; k < cloums2.length; k++) {

        for (var L = 1; L <= rows2; L++) {

          if (i == 1) {

            sheetAlarm[cloums2[k] + L].s = { //样式  

              font: {

                bold: true,

                italic: false,

                underline: false

              },

              alignment: {

                horizontal: "left",

                vertical: "left",

                wrap_text: false

              }

            };

          }

          else {

            sheetAlarm[cloums2[k] + L].s = { //样式  

              alignment: {

                horizontal: "left",

                vertical: "left",

                wrap_text: false

              }

            };

          }

        }

      }

      sheetAlarm["!cols"] = [{ wpx: 150 }, { wpx: 90 }, { wpx: 150 }, { wpx: 150 }]; //单元格列宽   

      try {

        var wbOut = XLSX.write(workbook, { bookType: "xlsx", bookSST: true, type: "array" });

        FileSaver.saveAs(

          new Blob([wbOut], { type: "application/octet-stream" }),

          "数据查询.xlsx"

        );

      } catch (e) {

        if (typeof console !== "undefined") console.log(e, wbOut);

      }

    //  return wbout;

    },

导出后表格样式如图:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Vue中的el-table组件是一个强大的表格组件,它可以方便地展示大量数据,并且支持分页功能。同时,借助前端库file-saver,我们可以实现将el-table中的数据导出Excel文件。 要实现这个功能,首先需要在Vue项目中安装file-saver库。可以使用npm或者yarn命令进行安装。 安装完毕后,我们可以在需要导出Excel的页面中引入file-saver库。 import { saveAs } from 'file-saver'; 在el-table数据源中,我们通常会使用一个数组来存储表格的数据。假设我们的表格数据为tableData,我们可以通过将这个数组转换为Excel文件来实现导出功能。 首先将表格数据转换为二维数组的形,使得每一行的数据存储在一个小数组中。 const exportData = tableData.map(row => { return Object.values(row); }); 然后,我们可以使用file-saver库提供的saveAs函数来将数据导出Excel文件。我们需要将二维数组导出为一个csv格的文本文件,并使用saveAs函数保存文件。 const csvContent = exportData.map(row => row.join(",")).join("\n"); const blob = new Blob(["\ufeff" + csvContent], { type: "text/csv;charset=utf-8" }); saveAs(blob, "export.csv"); 在上述代码中,我们首先将二维数组通过map和join方法转换为一个csv格的字符串,然后使用Blob创建一个Blob对象,最后使用saveAs函数将Blob对象保存为一个名为export.csv的文件。 通过上述步骤,我们就可以实现在Vue中使用file-saver库将el-table中的分页数据导出Excel文件导出文件可以方便地在Excel中查看和处理。 ### 回答2: Vueel-table组件和FileSaver,可以实现前端导出Excel导出分页数据的功能。 首先,我们需要引入el-table和FileSaver库,并确保已经正确配置了Vue项目。然后,在组件中使用el-table,并将分页数据绑定到el-table的data属性上。 接下来,我们需要添加一个导出按钮,用于触发导出操作。当按钮被点击时,我们可以通过el-table的方法将分页数据转换为一个二维数组,并使用FileSaver库将该数组导出Excel文件。 具体实现步骤如下: 1. 引入el-table和FileSaver库: ``` import FileSaver from 'file-saver'; import { ElTable, ElTableColumn } from 'element-ui'; ``` 2. 在组件中使用el-table,并将分页数据绑定到data属性上: ``` <template> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> ... </el-table> </template> <script> export default { data() { return { tableData: [], // 分页数据 ... }; }, ... }; </script> ``` 3. 添加一个导出按钮,并在按钮的点击事件中执行导出操作: ``` <template> <el-table :data="tableData"> ... </el-table> <el-button @click="exportExcel">导出Excel</el-button> </template> <script> export default { ... methods: { exportExcel() { const data = this.$refs.table.store.states.data; // 获取所有数据 const columns = this.$refs.table.columns.map(column => column.label); // 获取表头 const tableData = [columns, ...data]; // 构造二维数组 const worksheet = XLSX.utils.aoa_to_sheet(tableData); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }); FileSaver.saveAs(blob, 'data.xlsx'); }, ... } }; </script> ``` 以上代码通过el-table的$refs属性获取到el-table的实例,从而可以获取到所有数据和表头,并进行导出操作。最后使用FileSaver库将二维数组保存为Excel文件文件名为data.xlsx。 通过以上步骤,我们可以实现vue el-table前端导出Excel导出分页数据的功能。 ### 回答3: 在使用vue el-table和file-saver前端库导出Excel时,默认情况下只会导出当前展示页面的数据,无法导出分页数据。但我们可以通过以下步骤来实现导出分页数据的功能。 首先,我们需要手动获取所有需要导出数据。可以通过向后端发送请求获取所有数据的接口,并在前端将返回的数据进行合并。 然后,使用file-saver库将合并后的数据导出Excel文件。可以使用Blob对象将数据转换为二进制文件,再通过saveAs方法将二进制文件保存为Excel文件。 最后,展示给用户下载链接或直接自动下载导出Excel文件。 这样,我们就可以实现使用vue el-table和file-saver前端库导出分页数据的功能。 需要注意的是,如果数据量较大,一次性获取全部数据可能会影响前端性能和用户体验。因此,可以考虑在导出功能中添加限制,例如设置最大导出数量或者提供导出当前页和导出全部数据选项供用户选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值