首页 > 其他分享 >纯前端table表格导出excel文件,两种方法

纯前端table表格导出excel文件,两种方法

时间:2023-01-10 15:34:33浏览次数:36  
标签:let 表格 base64 excel return link str table row

先介绍第一种,因为第一种是直接获取dom节点的数据,可以直接快照形式捕获数据(比如获取过滤后或者格式化后的数据)

注意:依赖的版本,太高的话会报undefined

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


    /** 导出按钮操作 */
    exportExcel () {
      console.log(XLSX);
      /* generate workbook object from table */
      var wb = XLSX.utils.table_to_book(document.querySelector('#out-table'))
         /* get binary string as output */
         var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
         try {
             FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), 'sheetjs.xlsx')
         } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
         return wbout
    },

  第二种是书写一个html表格,然后base64转换成xls

exportExcelTwo() {
      let titleList = ['id', '标题', '作者', 'page', 'status', '时间']
      this.tableToExcel(this.list,titleList)
    },

    tableToExcel(data, excelStr) {
      //要导出的json数据
      const jsonData = data || []
      //列标题
      let str = excelStr || '<tr><td></td></tr>';
      //循环遍历,每行加入tr标签,每个单元格加td标签
      for (let i = 0; i < jsonData.length; i++) {
        str += '<tr>';
        for (let item in jsonData[i]) {
          //增加\t为了不让表格显示科学计数法或者其他格式
          str += `<td>${jsonData[i][item] + '\t'}</td>`;
        }
        str += '</tr>';
      }
      //Worksheet名
      let worksheet = '方法二'
      let uri = 'data:application/vnd.ms-excel;base64,';

      //下载的表格模板数据
      let template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns="http://www.w3.org/TR/REC-html40">
        <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
          <x:Name>${worksheet}</x:Name>
          <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
          </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
          </head><body><table>${str}</table></body></html>`;
      //下载模板
      // window.location.href = uri + base64(template)
      //通过创建a标签实现
      let link = document.createElement("a");
      link.href = uri + this.base64(template);
      //对下载的文件命名


      link.download = '标题.xls';
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    },
    //输出base64编码
    base64(s) {
      return window.btoa(unescape(encodeURIComponent(s)))
    }

  最后贴上两种方法都有的测试过程种的全部代码

<template>
  <div class="app-container">
    <el-button @click="exportExcel">导出-方法一</el-button>
    <el-button @click="exportExcelTwo">导出-方法二</el-button>
    <el-table
    id="out-table"
      v-loading="listLoading"
      :data="list"
      element-loading-text="Loading"
      border
      fit
      highlight-current-row
    >
      <el-table-column align="center" label="ID" width="95">
        <template slot-scope="scope">
          {{ scope.$index }}
        </template>
      </el-table-column>
      <el-table-column label="Title">
        <template slot-scope="scope">
          {{ scope.row.title }}
        </template>
      </el-table-column>
      <el-table-column label="Author" width="110" align="center">
        <template slot-scope="scope">
          <span>{{ scope.row.author }}</span>
        </template>
      </el-table-column>
      <el-table-column label="Pageviews" width="110" align="center">
        <template slot-scope="scope">
          {{ scope.row.pageviews }}
        </template>
      </el-table-column>
      <el-table-column :formatter="formatter" class-name="status-col" label="Status" width="110" align="center">
        <!-- <template slot-scope="scope">
          <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag>
        </template> -->
      </el-table-column>
      <el-table-column align="center" prop="created_at" label="Display_time" width="200">
        <template slot-scope="scope">
          <!-- <i class="el-icon-time" /> -->
          <span>{{ scope.row.display_time }}</span>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
import { getList } from '@/api/table'
import FileSaver from "file-saver";
import XLSX from "xlsx";

export default {
  filters: {
    statusFilter(status) {
      const statusMap = {
        published: 'success',
        draft: 'gray',
        deleted: 'danger'
      }
      return statusMap[status]
    }
  },
  data() {
    return {
      list: null,
      listLoading: true
    }
  },
  created() {
    this.fetchData()
  },
  methods: {
    formatter(row, column) {
      console.log(row.status);
      if(row.status === 'published') {
        return '成功了'
      } else if (row.status === 'draft') {
        return '失败了'
      } else {
        return row.status
      }
      },
    fetchData() {
      this.listLoading = true
      getList().then(response => {
        this.list = response.data.items
        this.listLoading = false
      })
    },
    /** 导出按钮操作 */
    exportExcel () {
      console.log(XLSX);
      /* generate workbook object from table */
      var wb = XLSX.utils.table_to_book(document.querySelector('#out-table'))
         /* get binary string as output */
         var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
         try {
             FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), 'sheetjs.xlsx')
         } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
         return wbout
    },

    exportExcelTwo() {
      let titleList = ['id', '标题', '作者', 'page', 'status', '时间']
      this.tableToExcel(this.list,titleList)
    },

    tableToExcel(data, excelStr) {
      //要导出的json数据
      const jsonData = data || []
      //列标题
      let str = excelStr || '<tr><td></td></tr>';
      //循环遍历,每行加入tr标签,每个单元格加td标签
      for (let i = 0; i < jsonData.length; i++) {
        str += '<tr>';
        for (let item in jsonData[i]) {
          //增加\t为了不让表格显示科学计数法或者其他格式
          str += `<td>${jsonData[i][item] + '\t'}</td>`;
        }
        str += '</tr>';
      }
      //Worksheet名
      let worksheet = '方法二'
      let uri = 'data:application/vnd.ms-excel;base64,';

      //下载的表格模板数据
      let template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns="http://www.w3.org/TR/REC-html40">
        <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
          <x:Name>${worksheet}</x:Name>
          <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
          </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
          </head><body><table>${str}</table></body></html>`;
      //下载模板
      // window.location.href = uri + base64(template)
      //通过创建a标签实现
      let link = document.createElement("a");
      link.href = uri + this.base64(template);
      //对下载的文件命名


      link.download = '标题.xls';
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    },
    //输出base64编码
    base64(s) {
      return window.btoa(unescape(encodeURIComponent(s)))
    }

  }
}
</script>

  

 

标签:let,表格,base64,excel,return,link,str,table,row
From: https://www.cnblogs.com/fdxjava/p/17040470.html

相关文章

  • no acceptable C compiler found in $PATH
    转载自:https://blog.csdn.net/IT_LPF/article/details/107360501 ======================================== Linux操作系统发生如下报错:noacceptableCcompiler......
  • elementui表格中实现点击单个单元格和表头--带参数触发事件/跳转路由
    对于element表格做点击跳转的功能有两大类:1,表头的点击跳转2,表格内容单元格进行点击跳转是因为该表格只有tabs标签也第二个选项被选中的时候才能让他起效果,所以先做判断,第......
  • SQLServer与excel和txt的导入导出
    execsp_configure'showadvancedoptions',1--启用高级配置选项设置reconfigure;--reconfigurewithoverride;--reconfigure不行则都用这个execsp_configure'AdHoc......
  • SSIS【Foreach 循环容器_Foreach ADO.NET 架构行集枚举器】(循环导入一个Excel所有工作
    SQLServer2008R2SSIS_Foreach循环容器_ForeachADO.NET架构行集枚举器(循环导入一个Excel所有工作簿)1.本节主要是循环把工作簿Sheet1、Sheet2、Sheet3中的数据插入到数据......
  • word2010中统一调整表格格式
    word中统一调整表格格式基本思路是:1、选中所有的表格。2、再对表格格式调整。选中所有表格需要用到宏,操作很简单,具体操作如下:(1)工具栏“视......
  • P1829 [国家集训队]Crash的数字表格 / JZPTAB
    求\[\sum^{n}_{i=1}\sum^{m}_{j=1}lcm(i,j)\]即\[\sum^{n}_{i=1}\sum^{m}_{j=1}\dfrac{ij}{\gcd(i,j)}\]即\[\sum^{\min(n,m)}_{k=1}\sum^{n}_{i=1}\s......
  • word2010中统一调整表格格式
    word中统一调整表格格式基本思路是:1、选中所有的表格。2、再对表格格式调整。  选中所有表格需要用到宏,操作很简单,具体操作如下:(1)工具栏“视图”下右下角“宏”。  (2)点击......
  • 【转】Vue+springboot集成PageOffice实现在线编辑Word、excel文档
    说明:PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转,领导批阅,盖章。可以给文件......
  • 表格封装
    <template><divv-if="showTable":style="cssVars"><a-table:columns="rowColumns":customRow="onClickRow":data-source="tableData"......
  • LLVM TableGen杂谈
    LLVMTableGen杂谈1.什么是tablegen tablegen是llvm用于开发和维护编译器中公共特性的条目(e.g.指令描述,寄存器描述)的代码,使之灵活的描述与构造的自动化工具.......