如何在 Vue 中导出数据至 Excel 表格

简介: 如何在 Vue 中导出数据至 Excel 表格

xlsx 库使用


更多使用参考npm:https://www.npmjs.com/package/xlsx


安装 xlsx 库


我们先来安装 xlsx 库 ,它是用来实现前端对 Excel 的解析:


npm install xlsx --save


当用户点击「导出至 Excel」按钮时,我们执行一个函数将 JSON 数据转化为 Excel 并下载到本地。


编写导出 Excel 的功能


<template>
    <div class="result-table">
      <b-table striped hover bordered :items="items"></b-table>
      <button type="button" class="kalacloudExportExcel-button" v-on:click="download">导出至 Excel</button>
    </div>
</template>
<script>
import XLSX from 'xlsx';
export default {
    name: 'xlsxTest',
    data() {
      return {
      }
    },
    methods: {
      download : function() {
        const data = XLSX.utils.json_to_sheet(this.items)
        const wb = XLSX.utils.book_new()
        XLSX.utils.book_append_sheet(wb, data, 'kalacloud-data')
        XLSX.writeFile(wb,'kalacloudExportExcel.xlsx')
      }
    }
}
</script>


我的案例


<template>
<div>
    <el-row><el-button
          @click.native.prevent="refreash"
          type="text"
          size="small">
          刷新
        </el-button></el-row>
    <el-table
    :data="tableData"
    ref="multipleTable"
    tooltip-effect="dark"
    border
    size="small"
    style="width: 100%; margin-top: 15px"
    @selection-change="handleSelectionChange"
    @filter-change="filterChange"
  >
    <el-table-column type="selection" width="55"></el-table-column>
    <el-table-column prop="id" label="ID"></el-table-column>
    <el-table-column prop="matchname" label="比赛名"></el-table-column>
    <el-table-column prop="school" label="学校名"></el-table-column>
    <el-table-column prop="collage" label="学院"></el-table-column>
    <el-table-column prop="dtype" label="用户类型">
      <template slot-scope="scope">
        <el-tag
          :type="
            scope.row.dtype == '2'
              ? 'primary'
              : scope.row.dtype == '1'
              ? 'success'
              : 'warning'
          "
        >
          {{scope.row.dtype === "2"? "管理员": scope.row.dtype === "1"? "校园代理": "城市代理"}}
          </el-tag
        >
      </template>
    </el-table-column>
   <el-table-column
      fixed="right"
      label="操作"
      width="160">
      <template slot-scope="scope">
        <el-button
          @click.native.prevent="deleteRow(scope.$index, tableData)"
          type="text"
          size="small">
          移除
        </el-button>
                <el-button
          @click.native.prevent="exportInfo(scope.$index, tableData)"
          type="text"
          size="small">
          导出竞赛信息
        </el-button>
      </template>
    </el-table-column>
    <!-- <el-table-column prop="user_state" label="状态" column-key="user_state"
      :filters="[{text:'启用',value:'AVAILABLE'},{text:'禁用',value:'DISABLE'}]">
      <template slot-scope="scope">
        <el-tag :type="scope.row.user_state == 'AVAILABLE' ? 'success':'warning'">
          {{scope.row.user_state == 'AVAILABLE' ? '可用':'禁用'}}</el-tag>
      </template>
    </el-table-column> -->
  </el-table>
</div>
</template>
<script>
// import XLSX from 'xlsx';
import * as XLSX from 'xlsx';
import { Request } from '../../utils/matchrequest'
export default {
  data() {
    return {
      tableData: [],
      tmp:[],
      matchDetailList:[]
    }
  },
  created(){
    this.getlist()
  },
  methods: {
      async getlist(){
        let _this = this
          var username = window.localStorage.getItem("username")
          let formData = {
            username: username,
          }
        this.yzy.post('match/getmatchlist', formData, function (res) {
            console.log("返回值#################")
            console.log(res)
            // this.data.tmp=JSON.parse(res)
            // this.data.tableData=JSON.parse(res)
          //  this.tableData = JSON.parseArray(res)
          // this.tableData = JSON.parse(res.data)
          let mm=[] 
          for(var i=0;i<res.data.length;i++){
            mm.push(res.data[i])
          }
          console.log(mm)
          // console.log(res.data[0])
          // let tt=[]
          // for(var item in res.data[0][0]){
          //     tt.push(item)
          //     console.log(item)
          // }
          _this.tableData = res.data
        })
      },
      refreash(){
          this.getlist()
      },
      deleteRow(index, rows) {
        //删除操作
        console.log(rows.id)
        rows.splice(index, 1);
      },
      // 查询该竞赛所以参赛学生信息
     async getMatchDetail(id,index){
        let _this = this
        let formData = {
          matchid:id
        }
      console.log("formData##################")
      console.log(formData)
        let url = 'getmatchinfolist'
        this.yzy.post('match/' + url, formData, function (res) {
          console.log(res)
          _this.matchDetailList = res.data
          console.log("this.matchDetailList####################")
          console.log(_this.matchDetailList)
          _this.importExcel(index)
        })
      },
      exportInfo(index, rows){
        console.log("this.tableData[index].pk_id#############")
        console.log(this.tableData[index].id)
        this.getMatchDetail(this.tableData[index].id,index)
      },
      importExcel(index, rows){
          const data = XLSX.utils.json_to_sheet(this.matchDetailList)
          const wb = XLSX.utils.book_new()
          XLSX.utils.book_append_sheet(wb, data, 'kalacloud-data')
          console.log(data)
          // 导出竞赛名+大学名
          XLSX.writeFile(wb,this.tableData[index].matchname+":"+this.tableData[index].school+'.xlsx')
      }
  }
};
</script>
<style>
.upload-demo {
  width: 100%;
}
</style>
相关文章
|
7天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
7天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
7天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
12天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
13天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
13天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
13天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
12天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
14天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
12天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
下一篇
无影云桌面