找回密码
 立即注册
搜索
查看: 415|回复: 0

[js组件] 使用layer.exce导出大批量数据方法

  [复制链接]
发表于 2023-2-23 14:26 | 显示全部楼层 |阅读模式
在 我们使用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,大功告成。有不理解的代码,请到群里交流。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2025-4-3 10:34 , Processed in 0.013809 second(s), 13 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表