vue 上传xlsx文件,读取文件内容,vue生成xlsx并下载

2022-05-13  本文已影响0人  莫伊剑客

依赖文件 xlsx

npm install xlsx

详细实现请见如下案例

<template>
    <div class='file'>
        <button class='file-btn' type='default' @click='fileXlsx'>上传JC Number 获取Approvers</button>
        <p>{{ fileName }}</p>
        <input class='uploadFile' type='file' @change='fileChange'>
    </div>
</template>

<script>
import { read, utils, writeFile } from 'xlsx';
import { getCandidateInfoByJCNumber } from '../../../api';

export default {
    name: 'FileXlsxGetApprovalers',
    data() {
        return {
            fileName: ''
        };
    },
    methods: {
        fileXlsx() {
            document.querySelector('.uploadFile').click();
        },
        fileChange(event) {
            if (!event.currentTarget.files.length) {
                return false;
            }
            // 拿取文件对象
            const file = event.target.files[0];
            // 显示文件名
            this.fileName = file.name;
            // 用FileReader来读取
            const reader = new FileReader();
            // 重写FileReader上的readAsBinaryString方法
            const rABS = true;
            reader.onload = (e) => {
                let dataResult = e.target.result;
                if (!rABS) dataResult = new Uint8Array(dataResult);
                const workbook = read(dataResult, {
                    type: rABS ? 'binary' : 'array'
                });
                // 假设我们的数据在第一个标签
                const firstWorksheet = workbook.Sheets[workbook.SheetNames[0]];
                // XLSX自带了一个工具把导入的数据转成json
                const jsonArr = utils.sheet_to_json(firstWorksheet, { header: 1 });
                document.querySelector('.uploadFile').value = null;
                const data = jsonArr.map(item => item[0]);
                this.getJCNumberData(data);
            };
            if (rABS) reader.readAsBinaryString(file);
            else reader.readAsArrayBuffer(file);
            return false;
        },
        getJCNumberData(paramsArr) {
            const arr = [];
            paramsArr.forEach(item => {
                arr.push(getCandidateInfoByJCNumber({ id: item }));
            });
            // 将返回数据写入xlsx并下载
            // eslint-disable-next-line compat/compat
            Promise.all(arr).then(res => {
                //res=[{name:'张三',age:18}]
                const ws=utils.json_to_sheet(res);
                const wb=utils.book_new();
                utils.book_append_sheet(wb,ws,'Approvers');
                writeFile(wb, "Approvers.xlsx");
            });
        }
    }
};
</script>

<style lang='less' scoped>
.file {
    padding-top: 30px;
}

.uploadFile {
    display: none;
}
</style>

上一篇下一篇

猜你喜欢

热点阅读