前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React结合Antd实现Excel导入导出

React结合Antd实现Excel导入导出

作者头像
越陌度阡
发布2020-11-26 12:28:51
4.4K0
发布2020-11-26 12:28:51
举报

最近公司的公众号管理系统需要添加Excel导入与导出功能,考虑到需要多个地方引用,所以开发了一个组件,下面把代码分享出来给大家。

首先是组件的代码,注意Antd是2.x的版本。

代码语言:javascript
复制
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {Button,Upload,message,} from 'antd';
import Cookies from 'js-cookie';
// 服务器地址,此处为了做演示,没有全局引入,直接写了
const Host = 'http://xxxxxx.cn';

class ImportExportExcel extends Component {
    constructor(props) {
        super(props);
        // 模板下载事件
        this.jumpTo = this.jumpTo.bind(this);
        // 表格导出事件
        this.exportExcel = this.exportExcel.bind(this);
        // 表格上传事件
        this.uploadProps.onChange = this.uploadProps.onChange.bind(this);
    }
    // 模板下载
    jumpTo() {
        window.open(this.props.templateHref);
    }
    // 上传参数
    uploadProps = {
        // 发到后台的文件参数名
        name: 'file_import',
        // 接受的文件类型
        accept: '.xls,.xlsx',
        // 上传的地址
        action: Host + this.props.url + '/import',
        // 是否展示上传的文件
        showUploadList:false,
        // 上传的参数
        data: {
            token: Cookies.get("token"),
            uid: Cookies.get('uid')
        },
        // 设置上传的请求头部,IE10 以上有效
        headers: {
            authorization: 'authorization-text',
        },
        // 上传文件前的钩子函数
        beforeUpload() {
            message.loading('正在导入中...');
            return true;
        },
        // 上传文件改变时的状态
        onChange(info) {
            if (info.file.status !== 'uploading') {
                console.log(info.file, info.fileList);
            }
            if (info.file.status === 'done') {
                if (info.file.response.code !== 200) {
                    setTimeout(() => {
                        message.destroy();
                        message.error(info.file.response.message);
                    });
                } else {
                    this.props.importSuccessCallback && this.props.importSuccessCallback();
                    setTimeout(() => {
                        message.destroy();
                        message.success('导入成功');
                    });
                }
            } else if (info.file.status === 'error') {
                setTimeout(() => {
                    message.destroy();
                    message.error('导入失败');
                });
            }
        },
    }

    // 导出Excel表格
    exportExcel() {
        const url = Host + this.props.url + `/export?token=${Cookies.get('token')}&uid=${Cookies.get('uid')}`;
        window.open(url);
    }

    render() {
        const uploadProps = this.uploadProps;
        return [
            <Button style={{marginLeft: 10}} key='exportExcel' onClick={this.exportExcel}>导出</Button>,
            <Upload style={{marginLeft: 10}} key='importExcel' {...uploadProps} >
                <Button>导入</Button>
            </Upload>,
            <Button style={{marginLeft: 10}} key='templateDowload' onClick={this.jumpTo}>模板下载</Button>
        ]
    }
}

// 定义参数类型
ImportExportExcel.propTypes = {
    // 模板下载地址
    templateHref: PropTypes.string.isRequired,
    // 上传地址
    url: PropTypes.string.isRequired,
    // 导入成功后的回调
    importSuccessCallback: PropTypes.func
};

export default ImportExportExcel;

以下是在组件中的使用方法,首先引入组件,引入路径根据实际存放情况自行修改。

代码语言:javascript
复制
import ImportExportExcel from "components/ImportExportExcel";

下面是组件在render方法里的调用,templateHref为模板下载地址,url为上传地址,importSuccessCallback为上传成功后的回调方法,对应的是请求表格数据的事件。

代码语言:javascript
复制
<ImportExcel
    templateHref={HOST + "/static/excel/excel_template.xlsx"}
    url='/api/user_manage'
    importSuccessCallback={() => this.getTableData({pages: 1})}
/>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档