php导出大量数据到Excel,可以通过生成多个Excel文件,然后压缩成压缩包解决。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网页空间、营销软件、网站建设、洛隆网站维护、网站推广。
方案是:假如我们数据库有10w条数据,每2000条数据生成一个Excel文件,这样每次只要从数据库里查询出2000条数据即可,一定要分页去查询。
原因:主要是数据库性能和写文件性能。分页查询可以解决数据库压力的问题, 生成多个文件可以解决单个文件太大,后期维护Excel文件的问题。
要注意的:
1. 在导出逻辑文件开头,一定要声明 set_time_limit(0) ,防止脚本超时;
2. 每个文件生成后,适当的sleep一下,让程序休息一下下;
3. 因为一次导出最后要将生成的多个Excel文件打包成一个压缩包,所以要删除掉生成的Excel文件,节省服务器存储空间;
下面是我实际工作中,写的一个php导出大量数据到Excel的代码,你可以参考一下:
$keynames=array(
'0'='订单号',
'1'='项目名称',
'2'='单价',
'3'='数量',
'4'='运费',
'5'='金额',
'6'='支付状态',
'7'='支付时间',
'8'='选项',
'9'='备注',
'10'='收件人',
'11'='手机',
'12'='送货地址',
'13'='物流',
'14'='物流单号'
);
down_excel($eorders, $keynames,$array_key, $name);
//生成简单excel。table生成。生成excel非标准。phpexcel生成的标准,可读写excel
function down_xls($data, $keynames, $name = 'dataxls') {
$xls [] = "htmlmeta http-equiv=content-type content=\"text/html; charset=UTF-8\"bodytable border='1'";
$xls [] = "trtdID/tdtd" . implode ( "/tdtd", array_values ( $keynames ) ) . '/td/tr';
foreach ( $data as $o ) {
$line = array (++ $index );
foreach ( $keynames as $k = $v ) {
$line [] = $o [$k];
}
$xls [] = 'trtd' . implode ( "/tdtd", $line ) . '/td/tr';
}
$xls [] = '/table/body/html';
$xls = join ( "\r\n", $xls );
header ( 'Content-Disposition: attachment; filename="' . $name . '.xls"' );
die ( mb_convert_encoding ( $xls, 'UTF-8', 'UTF-8' ) );
}
//add by wqc excel
function down_excel($data, $keynames,$array_key, $name = 'dataxls') {
require_once(dirname(dirname(dirname(__FILE__))) . '/PHPExcel/PHPExcel.php');
require_once(dirname(dirname(dirname(__FILE__))) . '/PHPExcel/PHPExcel/IOFactory.php');
//实例化phpexcel
$objPHPExcel = new PHPExcel();
$objPHPExcel-getActiveSheet()-getDefaultColumnDimension()-setWidth(16);//设置单元格宽度
$objPHPExcel-getActiveSheet()-setTitle('kutuan');//设置当前工作表的名称
foreach($keynames as $k=$r){
$objPHPExcel-getActiveSheet()-getStyleByColumnAndRow($k, 1)-getFont()-setBold(true);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow($k, 1, $r);
}
foreach($data as $key=$value)
{
//$objPHPExcel-getSheet(1)-getProtection()-setSheet(true);
//$objPHPExcel-getSheet(1)-protectCells(0, ($key+2),$value['id']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(0, ($key+2),$value['id']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(1, ($key+2),$value['team_id']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(2, ($key+2),$value['price']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(3, ($key+2),$value['quantity']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(4,($key+2),$value['fare']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(5, ($key+2),$value['origin']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(6, ($key+2),$value['state']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(7, ($key+2),$value['pay_time']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(8, ($key+2),$value['condbuy']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(9, ($key+2),$value['remark']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(10, ($key+2),$value['realname']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(11, ($key+2),$value['mobile']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(12, ($key+2),$value['address']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(13, ($key+2),$value['express']);
$objPHPExcel-getActiveSheet()-setCellValueByColumnAndRow(14, ($key+2),$value['express_no']);
}
$objPHPExcel-setActiveSheetIndex(0);//设置打开excel时显示哪个工作表$name.
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".$name);
header("Content-Transfer-Encoding: binary");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
return $objWriter-save('php://output');
}
超简单,假设当前脚本文件在a/目录中,代码如下:
// 首先需要检测b目录是否存在
if (!is_dir('b/')) mkdir('b/'); // 如果不存在则创建
// 在检测b/目录中是否存在c.php文件
if (!file_exists('b/c.php')) file_put_contents('b/c.php', 'd'); // 如果c.php不存在则创建,当然还可以使用$file = fopen('b/c.php', 'a+')的方式创建然后用fwrite('d', $file)写入d
以上若还有任何问题,欢迎追问~