封装Vue可选择列导出表格组件

1、创建ExportExcel.vue组件

<template>
 <div class="export_tools">
  <div v-show="false">
   <el-table id="out-table" style="width: 100%;" :data="exportTable">
    <template v-for="(item, index) in exportTitle">
     <el-table-column
      v-if="item.isExport"
      :prop="item.prop"
      :label="item.label"
      align="center"
      :key="index"
     >
      <template slot-scope="scope">
       <span>{{ scope.row[item.prop] ? scope.row[item.prop] : '-' }}</span>
      </template>
     </el-table-column>
    </template>
   </el-table>
  </div>
  <el-button v-if="showExportBtn" type="primary" v-debounce="export_data" icon="el-icon-download">导出表格</el-button>
 </div>
</template>

<script>
/**
 * 组件功能:可选择列导出表格。
 * 组件说明:需要从父组件中传入四个值,如下
 *  1、exportTable:需要导出的表格数据;
 *  2、exportTitle:表格中有哪些列是可以导出的;格式如下(isExport为true则导出此列,false则不导出此列):
 *          [
 *              {
 *                  prop:'对应的字段1',
 *                  label:'列名1',
 *                  isExport: true
 *              },
 *              {
 *                  prop:'对应的字段2',
 *                  label:'列名2',
 *                  isExport: false
 *              }
 *          ]
 *  3、excelName:导出的文件名,最后导出后文件的格式为:年-月-日 时_分_秒-excelName.xlsx,
 *  如 excelName 为 ‘通道数据表格’,则最后导出的文件名是:2022-01-14 10_40_52-通道数据表格.xlsx
 *  4、showExportBtn:是否显示 “导出表格” 按钮,默认显示,如不显示的话可以通过ref的方式直接调用 export_data 方法来导出表格。
 */
import FileSaver from 'file-saver'
import XLSX from 'xlsx'
export default {
 name: 'ExportExcel',
 props: {
  exportTable: {
   type: Array,
   required: true,
   default: [],
  },
  exportTitle: {
   type: Array,
   required: true,
   default: [],
  },
  excelName: {
   type: String,
   required: true,
   default: 'Data',
  },
  showExportBtn: {
   type: Boolean,
   required: false,
   default: true,
  },
 },
 data() {
  return {}
 },
 methods: {
  // 导出 excel 表格
  export_data() {
   if (this.exportTable.length == 0) return this.$message.warning('表格为空,无法导出...')
   // 为el-table添加一个id:out-table
   let wb = XLSX.utils.table_to_book(document.querySelector('#out-table'))
   let wbout = XLSX.write(wb, {
    bookType: 'xlsx', // 导出的文件类型
    bookSST: true,
    type: 'array',
   })
   try {
    FileSaver.saveAs(
     new Blob([wbout], { type: 'application/octet-stream' }),
     `${this.$dayjs().format('YYYY-MM-DD HH_mm_ss')}-${this.excelName}.xlsx`
    )
    setTimeout(() => {
     return this.$message.success('表格导出成功...')
    }, 1000)
   } catch (e) {
    if (typeof console !== 'undefined') console.log(e, wbout)
   }
   return wbout
  },
 },
 mounted() {},
}
</script>

<style lang="scss" scoped></style>

2、在父组件中引入

import ExportExcel from '../commonTools/ExportExcel.vue' // 导出表格组件

3、在components中注册组件

 components: {
  'export-excel': ExportExcel,
 },

4、在template中使用组件

<export-excel
     :exportTable="tableData"
     :excelName="excel_name"
     :exportTitle="export_title"
    ></export-excel>

注意:需要安装依赖

npm install --save xlsx file-saver
posted @ 2022-01-14 14:17  yw3692582  阅读(352)  评论(0编辑  收藏  举报