使用Ajax实现异步导出数据到excel

在处理大量用户数据导出Excel时,为了避免超时问题,采用Ajax异步方式来更新客户端状态。文章详细介绍了如何通过后台代码生成Excel文件,并在前端使用Ajax请求配合服务器响应来触发文件下载,同时指出了Ajax无法直接处理二进制流的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做项目的时候就遇到需要把用户分散在多个数据表中的数据整合到一起既可以在线查看,又能导出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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值