在vue中上传excel以及下载excel模板

项目需求

页面中可通过“添加功能”一个个的添加每个系统相应角色的负责人,但有时候有的需要批量添加,同时又需要提供模板供用户填写
在这里插入图片描述

操作步骤

找到合适的excel相关的插件
  1. 我这里最后使用的xlsx插件,详细信息见[link]https://www.npmjs.com/package/xlsx
  2. 这位大大的分享也是我在做的时候对我理解这个插件帮助比较大的[link]https://www.jianshu.com/p/31534691ed53
安装插件

$ npm install xlsx

在要使用的文件里引入插件

import XLSX from ‘xlsx’

在文件中使用
<template>
    <span class="excel-upload">
        <!-- 为了覆盖批量导入input type="file"的样式所写的 -->
        <span class="choose-file">
            <input type="file" @change="readExcel($event)">
            <el-button class="over-button" type="success" icon="el-icon-plus" size="small" plain>批量导入</el-button>
        </span>

        <!-- 导入模板下载按钮 -->
        <el-button type="success" @click="downloadTemplate()" size="small" plain>导入模板下载</el-button>

        <!-- 导入信息确认对话框 -->
        <el-dialog title="导入信息确认" :visible.sync="importConfirmDialog" width="1200px" :close-on-click-modal="false">
            <el-table :data="sheetDataArr.slice(pageSize*(currentPage - 1), pageSize*currentPage)"
                      header-cell-class-name="excel-upload-table-header"
                      class="excel-upload-table">
                <el-table-column prop="name" label="功能名"></el-table-column>
                <el-table-column prop="策划" label="策划"></el-table-column>
                <el-table-column prop="技术" label="技术"></el-table-column>
                <el-table-column prop="QA" label="QA"></el-table-column>
                <el-table-column prop="美术" label="美术"></el-table-column>
            </el-table>
            <div class="pagination-div">
                <el-pagination
                      @size-change="handleSizeChange"
                      @current-change="handleCurrentChange"
                      :current-page="currentPage"
                      :page-sizes="[10, 20, 30, 40]"
                      :page-size="pageSize"
                      layout="total, sizes, prev, pager, next, jumper"
                      :total="sheetDataArr.length">
                    </el-pagination>
            </div>
          <span slot="footer" class="dialog-footer">
            <el-button @click="importConfirmDialog = false">取 消</el-button>
            <el-button type="primary" @click="submitExcelUpload">确 定</el-button>
          </span>
        </el-dialog>
    </span>
</template>
<script>
import XLSX from 'xlsx'
export default {
  name: 'ExcelUpload',
  data(){
      return {
           templateData:[ // 导出的excel模板数据
              {
                  系统名称: '系统名称1',
                  策划: '张三',
                  技术:'李四, 王五',
                  QA: '小宝',
                  美术: '',
              },
          ],       
          sheetDataArr: [ // 导入的excel表数据
               {
                  系统名称: '系统名称1',
                  策划: ['张三'],
                  技术:['李四','王五'],
                  QA: ['小宝'],
                  美术: [],
              },           
          ],
          importConfirmDialog: false,
          currentPage: 1 ,
          pageSize: 10,
      }
  },
   computed: {
    projectId: function() {
        return this.$route.params.projectId;
    },
   },
  methods: {
    // 点击下载模板调用的函数
    downloadTemplate(){
        let ws = XLSX.utils.json_to_sheet(this.templateData)
        let wb = XLSX.utils.book_new()
        let xlsxName = '模板文件'
        XLSX.utils.book_append_sheet(wb, ws, xlsxName)
        XLSX.writeFile(wb, xlsxName + ".xlsx")
    },
    // 上传excel文件后马上回调用的函数
    readExcel(event) {
        // console.log('进来了')
        let file = event.target.files[0]
        let reader = new FileReader()
        reader.onload = (e) => {
            let data = e.target.result
            // 读取工作簿
            let workbook = XLSX.read(data, {type: "binary"})
            // 工作表名称集合
            let sheetNames = workbook.SheetNames;
            // 此处只读取第一张sheet
            let worksheet = workbook.Sheets[sheetNames[0]];
            // 将读取到的第一张sheet的数据转换为json格式,类似于data中的templateData
            let sheetDataArr = XLSX.utils.sheet_to_json(worksheet);
         
            // 将逗号分隔的多个用户转为数组形式
            let handleArr = []
            for(let item of sheetDataArr){
                let mailToArr = { name: item['功能名'], 策划: [], 技术: [], QA: [], 美术: [] ,project: this.projectId}
                let mailToArr['策划'] = item['策划'] ? item['策划'].split(/\s*(,|,)\s*/) : [] //正则是为了预防用户输入多人时,逗号不分中英文或者有好几个空格情况的出现
                let mailToArr['技术'] = item['技术'] ? item['技术'].split(/\s*(,|,)\s*/): []
                let mailToArr['QA'] = item['QA'] ? item['QA'].split(/\s*(,|,)\s*/): []
                let mailToArr['美术'] = item['美术'] ? item['美术'].split(/\s*(,|,)\s*/): []
               handleArr.push(mailToArr)
            }
            // sheetDataArr里面就是从excle文件里读取到的数据啦,格式类似于data中的sheetDataArr
            this.sheetDataArr = handleArr
            // 打开导入信息确认框
            this.importConfirmDialog = true
        }
        reader.readAsBinaryString(file)

    },

    // 确定批量添加的api以及确认框等操作
    submitExcelUpload(){
        this.$http.post('',this.sheetDataArr
        ).then(response => {
            this.importConfirmDialog = false;
            this.$alert(response['data']['msg']);
        })      
    },
    // 修改每页数据数量
    handleSizeChange(val) {
        this.pageSize = val
    },
    // 翻页
    handleCurrentChange(val) {
        this.currentPage = val
    },

  }
}
</script>
<style scoped lang="less">
    .choose-file{
        width:90px;
        margin-left:5px;
        position:relative;
        overflow:hidden;
        cursor: pointer;
    }
    input[type="file"]{
        width:90px;
        overflow:hidden;
        position:absolute;
        top:0;
        left:0;
        opacity:0;
    }
    .pagination-div{
        margin: 20px 30px 0 0;
        text-align: right;
    }
    .excel-upload-table{
        width:96%;
        margin-top:20px;
    }
</style>

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值