在 我们使用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,大功告成。有不理解的代码,请到群里交流。 |