最近做项目的时候就遇到需要把用户分散在多个数据表中的数据整合到一起既可以在线查看,又能导出excel。对于这个需求,如果用户量小的情况下直接点击链接跳转请求服务器处理从数据表中取出数据生成excel再返回客户端进行打开下载操作即可。但是当用户非常多,数据非常大的时候服务器处理请求的所需要的时间就会越长,当超出客户端获取响应的等待时间就会返回“502 Bad GateWay”这样的超时反馈。这显然不是我们想要。那么我们需要在处理数据的过程中持续给客户端反馈,以避免出现超时连接的情况。这时候就考虑用ajax异步处理数据读取过程,然后再通过window.location.href=regionURL;
来访问文件下载链接进行excel下载。(注意:ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,所以ajax无法处理二进制流的response来下载文件)
首先我们来看后台代码实现:
if ($_GET['exporttype'] == 'excel'){
if(!isset($_GET['id']) && !isset($_GET['end']))//id是指用户表的id,用来定位最后一个取出的数据,以此为标准取下一个1000条数据
return false;
if(isset($_GET['end'])){
//end表示数据已经全部准备完毕可以下载excel
import('libraries.excel');
$excel_obj = new Excel();
$excel_data = $_SESSION['excel_data'];
//设置样式
$excel_obj->setStyle(array('id'=>'s_title','Font'=>array('FontName'=>'宋体','Size'=>'12','Bold'=>'1')));
$excel_data = $excel_obj->charset($excel_data,CHARSET);
$excel_obj->addArray($excel_data);
$excel_obj->addWorksheet($excel_obj->charset('table1',CHARSET));
$file_name = $excel_obj->charset('用户行为数据统计',CHARSET).date('Y-m-d-H',time());
$excel_obj->generateXML($file_name);//生成excel文件,并使用header()函数来将它交付给浏览器。
unset ($_SESSION['excel_data']);return;//销毁session
}
//导出Excel
if($_GET['id'] == 0){
$excel_data = array();
//header
foreach ($statlist['head