PHP试题网_中国最大的免费网络PHP试题测试平台,PHP试卷调查,PHP试卷模板、PHP考试测验
公告: PHP试题网于2022.06.21变更为少儿编程学院

在 我们使用phpexcel或者phpoffice导出大批量数据时,生产环境报504的可能性相当大,因为服务器有内存限制。不可能一次取10万条数据到内存当中,这个时候,我们就需要考虑分次取数据,然后JS合并数据,再生成下载文件。绝对不会因为服务器限制导致无法导出数据。


有了理论,接下来就是实践:接招


第1步:加载必要的组件:layer.excel

<link rel="stylesheet" type="text/css" href="{$Think.PLUGINS_SITE_ROOT}/layuiv2.4.3/css/layui.css">
<script type="text/javascript" src="{$Think.PLUGINS_SITE_ROOT}/layuiv2.4.3/layui.js"></script>
<script type="text/javascript">
    layui.config({
        base: '{$Think.PLUGINS_SITE_ROOT}/layuiv2.4.3/lay/extend/'
    }).extend({
        excel: 'excel'
    });
</script>


第2步:合并ajax得到的数据,并生成下载文件

<script>
    var alldata = [];
    var layername;
    var strwhere;

    layui.use(['jquery', 'layer', 'excel'], function(){
        var $ = layui.jquery;
        var layer = layui.layer;
        var excel = layui.excel;

        function exportFile() {
            alldata.unshift({
                    'goods_id':'商品id'
                    ,'goods_name' : '商品名称'
                    ,'goods_supper_mark' : '商品货号'
                    ,'goods_serial' : 'SKU'
                    ,'gc_name' : '分类名称'
                    ,'goods_click' : '点击量'
                    ,'goods_salenum' : '销售量'
                    ,'goods_collect' : '收藏量'
                    ,'seller_goods_type' : '商品销售区域'
                    ,'goods_commis_rate' : '商品分佣比率%'
                    ,'store_name' : '店铺名称'
                    ,'goods_freight' : '是否包邮'
            });
            //导出excel
            excel.exportExcel({
                sheet1:alldata
            }, '商品相关排序导出_' + new Date().toLocaleString() + '.xlsx', 'xlsx');
        }

        function ajax_and_merge_data(where)
        {
            strwhere = where;
            $.get('', where, function(ret){//取数据的url为当前网址

                for(var i= 0; i <= ret['data']['list'].length - 1 ; i++)
                {
                    row = ret['data']['list'][i];
                    //console.log(row);
                    window.alldata.push(row);//合并数据
                }

                if(ret['data']['hasMore'] === 0)
                {
                    exportFile();
                    $('#act').val('');
                    layer.close(layername);
                    return;
                }else{
                    //alert('ccc');
                    var page = '&page=' + (ret['data']['current_page'] + 1);
                    if(strwhere.indexOf('&page') === -1) {
                        strwhere = strwhere + page;
                    }else{
                        strwhere = strwhere.replace('&page=' + ret['data']['current_page'], page);
                    }
                    ajax_and_merge_data(strwhere);
                }
            }, 'json').error(function(){
                layer.alert('网络请求错误');
            });
        }

        $(function(){
            $('#export').off('click').on('click', function(){
                $('#act').val('export');

                layername = layer.load(0, {shade:[0.5, '#eee']});
                layer.title('正在导出数据,请稍候……', layername);//没有效果,不管它

                strwhere = $('#formSearch').serialize();

                ajax_and_merge_data(strwhere);

            });
        });

    });
</script>


OK,大功告成。有不理解的代码,请到群里交流。


作者:OK兄 浏览次数:87