zoukankan      html  css  js  c++  java
  • axios请求导出数据到excel文件

    客户端利用axios自己封装了一个request,文件名为http.js

    import axios from 'axios';
    import history from './history';
    
    export const baseUrl = '/api';
    
    const request = axios; // or axios.create({})
    request.defaults.baseURL = baseUrl;
    request.interceptors.request.use(config => {
        // const { url, data } = config;
        // console.log(`send request[${url}]: ${JSON.stringify(data)}`);
        return config;
    });
    request.interceptors.response.use(
        response => {
            const {
                // config: { url },
                data,
            } = response;
            // console.log(`receive response[${url.replace(baseUrl, '')}]: ${JSON.stringify(data)}`);
            return data;
        },
        error => {
            console.log(`receive response[${'url'}]: ${JSON.stringify(error)}`);
            return Promise.reject(
                error && error.response && error.response.data && error.response.data.message ? error.response.data.message : error,
            );
        },
    );
    
    const method = {
        get: (url, data = {}) => {
            return request.get(url, { params: data });
        },
    
        post: (url, data = {}) => {
            return request.post(url, data);
        },
    
        export: (url, fileName = 'download.xlsx', data = {}) => {
            if (typeof fileName === 'object') {
                data = fileName;
                fileName = 'download.xlsx';
            }
    
            request({
                method: 'post',
                url,
                data,
                responseType: 'blob',
            })
                .then(res => {
                    if (res.type === 'application/json') {
                        console.log('文件导出失败: ', res);
                        return;
                    }
    
                    const href = window.URL.createObjectURL(new Blob([res]));
    
                    const link = document.createElement('a');
                    link.style.display = 'none';
                    link.href = href;
                    link.setAttribute('download', fileName);
    
                    document.body.appendChild(link);
                    link.click();
                    document.body.removeChild(link);
                    window.URL.revokeObjectURL(href);
                })
                .catch(error => {
                    console.log('文件导出失败: ', error);
                });
        },
    
        form: (url, data = {}) => {
            const form = document.createElement('form');
            form.style = 'display:none;';
            form.method = 'post';
            form.action = baseUrl + (url[0] === '/' ? '' : '/') + url;
    
            const values = JSON.stringify(data);
            if (values !== '{}') {
                const input = document.createElement('input');
                input.type = 'hidden';
                input.name = 'values';
                input.value = values;
                form.appendChild(input);
            }
    
            document.body.append(form);
    
            form.submit();
            form.remove();
        },
    
        all: (...https) => {
            return new Promise((resolve, reject) => {
                request
                    .all(https)
                    .then(
                        axios.spread((...resList) => {
                            // 多个请求都发送完毕,拿到返回的数据
                            resolve(resList);
                        }),
                    )
                    .catch(err => {
                        reject(err);
                    });
            });
        },
    };
    
    export const http = (url, data, success, fail) => {
        return new Promise((resolve, reject) => {
            method
                .post(url, data)
                .then(res => {
                    const { code } = res;
                    if (code === 101) {
                        history.replace('/');
    
                        history.fail && fail();
                        reject();
                    }
                    if (code === 100 || code === 102) {
                        history.replace('/login');
    
                        fail && fail();
                        reject();
                    } else {
                        success && success(res);
                        resolve(res);
                    }
                })
                .catch(error => {
                    fail && fail(error);
                    reject(error);
                });
        });
    };
    
    export default method;
    

     另一个jsx中使用:

    import React from 'react';
    import * as antd from 'antd';
    import request from '@/common/http';
    
    const { Button } = antd;
    
    class Wrapper extends React.Component {
        exportPaidUsers = () => {
            request.export('user/exportPaidUsers', '付费用户列表.xlsx');
        };
    
        // 渲染
        render() {
            return (
                <div>
                    <div style={{ marginBottom: 30 }}>
                        <span>
                            <Button type='primary' onClick={this.exportPaidUsers.bind(this)}>
                                导出所有付费用户
                            </Button>
                        </span>
                    </div>
                </div>
            );
        }
    }
    
    export default Wrapper;
    

     服务端php:

    public static function download(PHPExcel $excel, String $fileName = 'download')
        {
    	    $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
    	    if(preg_match('/msie/i', $ua)
    		    || preg_match('/edge/i', $ua)
    		    || preg_match('/trident/i', $ua)
    	    )
    	    {
    		    $fileName = urlencode($fileName);
    	    }
    
    	    ob_end_clean();
    	    header('Content-Type: application/vnd.ms-excel;charset=utf-8');
    	    header(sprintf('Content-Disposition: attachment;filename="%s.xlsx"', $fileName));
    	    header('Cache-Control: max-age=0');
    
    	    $ta[] = microtime(true);
    
    	    $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
    	    $writer->save('php://output');
    
    //	    $ta[] = microtime(true);
    
    	    log_message2('download: ', $ta);
    
    	    exit;
        }
    

    完成了!

  • 相关阅读:
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    智能生活 “视”不可挡——首届TCL杯HTML5智能电视开发大赛等你来挑战
    点滴的积累---J2SE学习小结
    公开课
    iOS学习之 plist文件的读写
    【STL】关联容器 — hash_set
    《Pro Android Graphics》读书笔记之第三节
    第一章. ActionScript 语言基础
    JAVA数组的定义及用法
    MS-SQLSERVER中的MSDTC不可用解决方法
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/12757915.html
Copyright © 2011-2022 走看看