在 我们使用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