web页面中导出Excel (方法一) 后端php导出Excel
这个示例使用 前端 easyui-datagrid 后端php
其中前端是不是 easyui-datagrid 不重要,这个方法主要是使用后端 php 来实现导出Excel
优点:现在的应用中大部分是分页显示的,在前台只显示一部分,但导出Excel是要看全部的。所以此时用前端js导出则不太好实现。
缺点:当查询数据量较大或较慢时,不建议用此方法,毕竟http请求会超时。如果导出超几万行,则用winform开发导出程序比较好。
界面
html
<table id='grid'class='easyui-datagrid' style='width:1250px;min-height:450px' title='列表' iconCls='icon-table' pagination='true' rownumbers='true' fitColumns='true' singleSelect='true' toolbar='#toolbar' > <thead> <tr> <th field='agent_name' width='25'align='center' sortable='true' >工号</th> <th field='user_name' width='25'align='center' sortable='true' >坐席员</th> <th field='login_time' width='30'align='center' sortable='true' >登陆时间</th> <th field='logout_time' width='30'align='center' sortable='true' >登出时间</th> <th field='time_len' width='30'align='center' sortable='true' >在线时长</th> <th field='time_len_s' width='30'align='center' sortable='true' >在线时长(秒)</th> <th field='description' width='30'align='center' sortable='true' >描述</th> </tr> </thead> </table> <div id='toolbar' style='display: flex;align-items:Center; height:35px;' > <a href='javascript:void(0)' class='easyui-linkbutton' iconCls='icon-excel' plain='true' onclick='ToExcel()' <{$ToExcel_disabled}> >导出</a> <div class="btn-separator"></div> <a href='#' class='easyui-linkbutton' iconCls='icon-refresh' plain='true' onclick='Refresh()'>刷新</a> <a href='#' class='easyui-linkbutton' iconCls='icon-cancel' plain='true' onclick='parent.TabClose();'>关闭</a> </div>
js
实现原理:第一次请求是与查询按钮请求的php文件是一个,通过get来判断,目的是为了与查询得到的结果一致,导出调用只需得到条件和排序
function ToExcel(){ var query=SelectParameter(); var url='Api-index.php?module=<{$module_name}>&action=Api_ReportView_Agent_Login_List_Select&target=ToExcel<{$get_current_user}>' ; /* 获取 条件 */ $.ajax({ url: url, type: "post", data: query, dataType: "json", success: function (data) { //alert(data.where); alert(data.total); var where=data.where;//将条件 传出 var order_by=data.order_by;//排序 //alert(where); if(where==""){ //$.messager.alert('消息','导出时的发生异常,请刷新后,再试! ','info'); layer.alert('导出时的发生异常,请刷新后,再试!', { title:"消息",icon: 2, skin: 'layui-layer-molv',closeBtn: 0 } ); return; } location.href=encodeURI('modules/<{$module_name}>/ReportView_Agent_Login_List_ToExcel.php?where='+where +"&order_by=" +order_by); } }); } //获取 查询 条件 参数 function SelectParameter(){ var agent_name=$('#select_agent_name').combobox('getValue'); var start_time=$('#start_date_entered').val(); var stop_time=$('#stop_date_entered').val(); var query={'agent_name':agent_name,'start_time':start_time,'stop_time':stop_time }; return query; }
//查询按钮
function Select(){ var query=SelectParameter(); var url='Api-index.php?module=<{$module_name}>&action=Api_ReportView_Agent_Login_List_Select'; $('#grid').datagrid('options').url=url; $('#grid').datagrid('options').queryParams=query; $('#grid').datagrid('reload'); }
php
查询页 Api_ReportView_Agent_Login_List_Select.php
<?php //-----------------------------------------------查询------------------------------------ $arr_result = array(); //返回值 $where='';//查询条件 if(!empty($_POST['start_time'])){ $start_time=$_POST['start_time']; $stop_time=$_POST['stop_time']; } else{ //当天 $start_time=date("Y-m-d 0:0:0",strtotime("now")); $stop_time=date("Y-m-d 23:59:59",strtotime("now")); } //$where=" date_time >='{$start_time}' and date_time <='{$stop_time}' "; $where=" login_time >='{$start_time}' and login_time <='{$stop_time}' "; //坐席 if($_REQUEST['agent_name']!='' && $_REQUEST['agent_name']!='0'){ // $where .=" and cti_agent_login.agent_name = '{$_REQUEST['agent_name']}' "; } //结果集 $items = array(); //整合条件 $where= " " . $where; $order_by=" ORDER BY login_date asc"; //条件 //导出 或 打印 if($_GET['target']=="ToExcel" || $_GET['target']=="Print" ){ $arr_result['where'] = $where; //将条件 传出 $arr_result['order_by'] = $order_by; //将条件 传出 echo json_encode($arr_result); //将条件 传出 exit(0); } //分页 $page = isset($_POST['page']) ? intval($_POST['page']) : 1; $rows = isset($_POST['rows']) ? intval($_POST['rows']) : 10; $offset = ($page-1)* $rows; $sql ="SELECT COUNT(cti_agent_login.id) AS total FROM cti_agent_login join user on cti_agent_login.agent_name=user.user_id where " . $where ; //WriteLog($sql); $arr_result['total'] =$db->query_count($sql);//查询 总条数 $sql="SELECT cti_agent_login.agent_name , user.user_name as user_name,login_date,login_time,logout_time,time_len,time_len_s,cti_agent_login.description FROM "; $sql.=" cti_agent_login join user on cti_agent_login.agent_name=user.user_id where "; $sql.=" " .$where .$order_by ." limit $offset,$rows "; $result_rows=$db->query($sql); $row_count=$db->num_rows($result_rows);//行数 while($row=$db->fetch_array($result_rows)) { array_push($items, $row); } $arr_result['rows'] = $items; echo json_encode($arr_result); ?>
导出Excel页 ReportView_Agent_Login_List_ToExcel.php
实现原理:通过查询页得到的查询条件(当然也可以不这么做,在此页写也可以,这么做的目的是为了和查询保持一致)
在此页 整合查询SQL语句,访问数据库,得到结果集,用php嵌套for循环的方式像写文件方式写出Excel。所以当数据量较大时会慢,容易造成http请求超时。
<?php error_reporting(E_ALL^E_NOTICE);//Notice不显示 ^E_DEPRECATED set_time_limit(0);//不设 php 超时限制 require_once('../../config.php'); require_once('../../Log/LogHelper2.php'); require_once('../../myClass/myDBHelper2.php'); $arr_result = array(); //返回值 $where='';//查询条件 $order=""; if(!empty($_GET['where'])){ if($_GET['where']!=""){ $where=$_GET['where']; if(!empty($_GET['order_by'])){//$_GET['order_by'] 存在则赋值 不存在则默认为"" $order_by=$_GET['order_by']; }else{ $order_by=""; } }else{ $where=' 1=0 ';//查不到的数据 } }else{ $where=' 1=0 ';//查不到的数据 } $where=stripslashes($where); $order_by=stripslashes($order_by); //$col=" name,date_entered, callerid , other_tel,call_type,contact_province,contact_city "; //$col.=" ,contact_office,address,description,created_user_name,contact_source,remark "; //$sql = "select {$col} from {$table_name} where ".$where .$order_by ;//." limit $offset,$rows "; $sql="SELECT cti_agent_login.agent_name , user.user_name as user_name,login_time,logout_time,time_len,time_len_s,cti_agent_login.description FROM "; $sql.=" cti_agent_login join user on cti_agent_login.agent_name=user.user_id where "; $sql.=" " .$where .$order_by; $row = array(); $row[]="坐席工号"; $row[]="坐席员"; $row[]="登陆时间"; $row[]="登出时间"; $row[]="在线时长"; $row[]="在线时长(秒)"; $row[]="描述"; $items = array(); array_push($items, $row); $result=$db->query($sql); while($row1=$db->fetch_array($result)){ array_push($items, $row1); /* for ($i = 0; $i < sizeof($row1); $i++) { WriteLog( $row1[$i] . "1" . "<br>"); } */ //$str1=$row1[0].$row1[1].$row1[2].$row1[3]; //WriteLog($str1); } //Excel文件名 $date_now=date("YmdHis",strtotime("now")); $filename="Book".$date_now.".xls"; createExcelFile($fileName,$items); return; //创建Excel function createExcelFile($fileName,$excelData){ header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache"); header ('Content-type: application/x-msexcel'); header ("Content-Disposition: attachment; filename=Book".$date_now.".xls" ); header ("Content-Description: PHP/INTERBASE Generated Data" ); xlsBOF(); // Excel for ($row = 0; $row < sizeof($excelData); $row++) { for ($col = 0; $col < sizeof($excelData[$row]); $col++) { $value=iconv("UTF-8", "GBK//IGNORE", $excelData[$row][$col]); xlsWriteLabel($row,$col,$value); } } xlsEOF(); // Excel exit(); } ///////////////////////////////////////////////////////////////////// // function xlsBOF() { echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; } // Excel end of file footer function xlsEOF() { echo pack("ss", 0x0A, 0x00); return; } // Function to write a Number (double) into Row, Col function xlsWriteNumber($Row, $Col, $Value) { echo pack("sssss", 0x203, 14, $Row, $Col, 0x0); echo pack("d", $Value); return; } // Function to write a label (text) into Row, Col function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; return; } ?>