最近公司要用到客户导入导出,导入由于是要给客户用户,需要下载报表,所以导入采用phpexecl来处理表格,说实话,小量数据还可以接受,数据一上千,上万,机器配置性能不好,直接挂的节奏,特别涉及到多表数据查询,业务复杂,你的性能会越低
导入的话,总结了以下,优化了。第一,不要在循环中使用sql,不要一条条导数据,要想办法最后拼装成一条sql执行插入,你想下,你要导入1万条数据,你执行1万条sql和1条sql的区别是很大的。
今天主要说的是导出,如果你要导出大量数据,业务逻辑复杂的话,建议csv导出,缺点是没有样式,不能设置行高。等设置,好处,快,快,快。
使用php内置函数fputcsv()函数
//处理csv
fileName = "拼团订单明细";header = [
'拼团主单号',
'拼团子单号',
'子订单号',
'支付时间',
'交易流水号',
'商品SKU',
'商品名称',
'规格',
'数量',
'金额',
'下单用户id',
'下单用户昵称',
'团长id',
'团长昵称',
'拼团订单状态',
'销售订单状态',
]; //表头信息
fields = [
'groupon_no',
'groupon_child_no',
'parcel_number',
'pay_time',
'pay_transaction_id',
'sku_id',
'good_name',
'specification',
'buy_goods_num',
'pay_amt_e2',
'buyer_id',
'buyer_name',
'groupon_author_id',
'groupon_author_name',
'buyer_status',
'sell_order_status',
];
//设置headerheader = array_combine(fields,header);
BaseFormModel::csvExport(data,header, [], fileName, true, 'utf-8');
/**
* 导出csv
* @param arraydata 数据
* @param array headers csv标题+数据
* @param arrayspecHeaders 需要转成字符串的数组下标
* @param string fileName 文件名称
* @param boolisFirst 是否只去第一条
* @param string fontType 需要导出的字符集 csv默认为utf-8
* @author zhaohao
* @date 2019-12-10 11:38
*/
public static function csvExport(arraydata, array headers,specHeaders = [], fileName = '',isFirst = false, fontType = 'gbk//IGNORE')
{
//终端导出无需header头
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' .fileName . '.csv"');
header('Cache-Control: max-age=0');
fp = fopen('php://output', 'a');
foreach (headers as key =>value) {
headers[key] = mb_convert_encoding(value,fontType, 'utf-8');
}
if (isFirst) {
fputcsv(fp, headers);
}
//计数器num = 0;
limit = 50000;
//逐行取出数据,不浪费内存count = count(data);
for (i = 0; i<count; i++) {num++;
if (limit % 200 ==num) {
ob_flush();
flush();
num = 0;
}row = data[i];
ret = [];
foreach (headers as key =>value) {
if (!empty(specHeaders) && in_array(key, specHeaders)) {ret[key] = mb_convert_encoding(row[key],fontType, 'utf-8') . "t";
} else {
ret[key] = mb_convert_encoding(row[key], fontType, 'utf-8');
}
}
fputcsv(fp, ret);
}
unset(data);
unset(ret);
fclose(fp);
exit;
}










