vue 利用 js-xslx插件实现前端解析 excel 表格获取数据

news/2024/7/10 1:36:26 标签: vue, excel
<template>
    <div>
        <p  class="top">支持通过excel文件批量员工信息,请按`在这里插入代码片`照模板格式编辑员工信息后上传、下载模板。</p>
        <input class="input-file" type="file" @change="exportData"
            accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"/>
        <el-button type="primary" @click="btnClick">导入EXCEL</el-button>
        <p v-if="isVisibleSuccess" class="import-success">导入成功</p>
        <div class="footer">
            <el-button @click="cancel">取消</el-button>
            <el-button type="primary" @click="onSubmit">立即创建</el-button>
        </div>
    </div>
</template>

<script>
    import XLSX from 'xlsx'

    export default {
        name: 'importFile',
        data() {
            return {
                outdata: null,
                isVisibleSuccess: false,
                index: 1, //上传顺序
            }
        },
        methods: {
            btnClick() {
                this.isVisibleSuccess = false
                document.querySelector('.input-file').value = ''
                document.querySelector('.input-file').click()
            },
            exportData(event) {
                console.log(document.querySelector('.input-file'));
                if (!event.currentTarget.files.length) {
                    return
                }
                let _this = this
                    // 拿取文件对象
                var f = event.currentTarget.files[0]
                    // 用FileReader来读取
                var reader = new FileReader()
                    // 重写FileReader上的readAsBinaryString方法
                FileReader.prototype.readAsBinaryString = function(f) {
                    var binary = ''
                    var wb // 读取完成的数据
                    var outdata // 你需要的数据
                    var reader = new FileReader()
                    reader.onload = function(e) {
                        // 读取成Uint8Array,再转换为Unicode编码(Unicode占两个字节)
                        var bytes = new Uint8Array(reader.result)
                        var length = bytes.byteLength
                        for (var i = 0; i < length; i++) {
                            binary += String.fromCharCode(bytes[i])
                        }
                        // 接下来就是xlsx了,具体可看api
                        wb = XLSX.read(binary, {
                                type: 'binary'
                            })
                            // console.log(wb);
                        outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[1]])
                        _this.isVisibleSuccess = true //显示成功
                        _this.outdata = outdata //获取数据
                        console.log(outdata)
                    }
                    reader.readAsArrayBuffer(f)
                }
                reader.readAsBinaryString(f)
            },
            // 提交
            onSubmit() {
                console.log(this.outdata);
                let data = [];
                this.outdata.forEach((item, index) => {
                    data.push({
                        iname: item['姓名'] || '',
                        ID_number: item['身份证号码'] || '',
                        sex: item['性别'] || '',
                        mobile: item['手机号码'] || '',
                        dept1: item['一级部门'] || '',
                        dept2: item['二级部门'] || '',
                        dept3: item['三级部门'] || '',
                        work_name: item['岗位'] || '',
                    })
                })
            },
        }
    }
</script>

<style lang="scss" scoped>
    .input-file {
        display: none;
    }
    
    .top {
        margin-bottom: 15px;
    }
    
    .footer {
        text-align: right;
        margin-top: 15px;
    }
    
    .import-success {
        margin-top: 10px;
        color: rgba(10, 180, 105, 1);
    }
</style>

http://www.niftyadmin.cn/n/1845046.html

相关文章

Java设计模式(学习整理)---工厂模式

1、工厂模式 1.1 为什么使用工厂模式&#xff1f; 因为工厂模式就相当于创建实例对象的new&#xff0c;我们经常要根据类Class生成实例对象&#xff0c;如A anew A() 工厂模式也是用来创建实例对象的&#xff0c;所以以后new时就要多个心眼&#xff0c;是否可以考虑实用工厂模式…

算法:二叉树的层平均值

题目 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 输入&#xff1a;3/ \9 20/ \15 7 输出&#xff1a;[3, 14.5, 11]题解&#xff1a; 也就是遍历树结构&#xff0c;广度优先。 1&#xff0c;用一个数组&#xff0c;将第一层都装进去。 2&#xff0c;将此数…

element-ui利用jsx语法自定义table表头

element-ui利用jsx语法自定义table表头 1. 需求 需要自定义如下表头 2. table表头 这里说一下render-header属性&#xff0c;这是官网给出的解释 这是我的表头 3. jsx自定义表头 Game over

算法:leetocde79. 单词搜索

给定一个二维网格和一个单词&#xff0c;找出该单词是否存在于网格中。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 执行起来暂时没问题&#…

fullPage.js 实现点击按钮滚动一屏的效果

fullPage.js 实现点击按钮滚动一屏的效果 afterRender() 这个回调函数只是在生成页面结构的时候调用。这是要用来初始化其他插件或删除任何需要的文件准备好代码的回调&#xff08;这个插件修改DOM创建得到的结构&#xff09;。 afterRender: function () {$(点击事件).click…

报错 no such file or directory, scandir ...\node-sass\vendor'

背景&#xff1a; 公司让给一个Vue项目加一个模块&#xff0c;拿到代码之后&#xff0c;安装依赖&#xff0c;第一步就已经报错了&#xff0c;头疼 throw er; // Unhandled error event^查了很久发现是端口号被占了&#xff0c;重新安装或者把其他项目给关掉就应该可以了。 依…

算法:中序遍历

分析&#xff1a; 中序遍历&#xff0c;就是先遍历二叉树的 左节点&#xff0c;再取顶节点&#xff0c;再取右节点。 如图&#xff1a; 那从一个最小的二叉树扩展开以后&#xff0c;也是一个道理&#xff1a; 如下图&#xff0c;遍历顺序1-2-3-4-5-6 算法&#xff1a; 1&#x…

echarts tooltip自动轮播

echarts tooltip自动轮播 需求&#xff1a;实现图表的tootip自动轮播 原理&#xff1a;用到dispatchAction方法&#xff0c;以下是echarts上的介绍 初始化data this.myChart.dispatchAction({ type: showTip,seriesIndex: 0,dataIndex: 0 });轮播定时 let idx 1; setInterv…