最近系统有一个导出报表功能,之前是导出的.xsl报表,但是当导出数据达到十万条时,导出经常出现超时与导出数据不全的情况,原因是导出.xsl报表会进行HTML渲染,在这步就会卡死。所以改成了导出.csv表格。.csv表格所有数据相当于是一个字符串,字符串之间用逗号分隔开。这样就减少了文件大小,同时减少了渲染过程,可大幅提升性能,用于大数据导出,下面贴出相应代码
<?php $tableheader = array('项目编号', '项目ID', '原始债权编号', '项目名称', '借款人','产品类型','合同开始时间','合同结束时间','放款时间', '项目金额','服务费','已扣服务费','还本付息方式','付息总期数','第几期', '应付息时间','应付息金额','应付本金额','管理费','逾期付息时间', '逾期违约金','应还总额','已还款','当前状态','还款渠道','交易金额','还款用途','交易时间'); $tablelength = count($tableheader); /*表格数据*/ $data=array(); $rawData =$model->search()->rawData; for ( $i =0; $i < count($rawData,0); $i ++ ) { $item=$rawData[$i]; $item['projectId']=preg_replace("/(,)/"," ",$item['projectId']); $data[$i]=array($item['orderNo'],$item['projectId'],$item['debtNo'],$item['title'], $item['debitName'], $item['projectTypeName'],$item['startTime'],$item['endTime'],$item['loanTime'], $item['borrowAmount'],$item['serviceCost'],$item['rcvedServiceCost'],$item['repayTypeName'],$item['totalPeriods'],$item['periods'], $item['planTime'],$item['interest'],$item['principal'],$item['manageAmount'],$item['breachTime'], $item['breachAmount'],$item['totalAmount'],$item['hasRepay'],$item['statusName'],$item['rechargePlatName'],$item['rechargeAmount'],$item['purposeName'],$item['rechargeTime']); } /*输入到CSV文件 解决乱码问题*/ $html = "xEFxBBxBF"; /*输出表头*/ foreach ($tableheader as $value) { $html.= $value." ,"; } $html.= " "; /*输出内容*/ foreach ($data as $value) { for ($i = 0; $i < $tablelength; $i++) { $html.= $value[$i].","; } $html.= $value['createtime'].","; $html.= " "; } //echo implode('#',$data[0]) /*输出CSV文件*/ header("Content-type:text/csv"); header ( "Content-Disposition:filename=还本付息报表-".date('Y-m-d').".csv" ); echo $html; exit(); ?>
备注:1.在输出内容的代码里$html.= $value[$i].",";使用","分割数据,之前我用的分割代码是$html.= $value[$i]."/t,";,这样多了"/t",也就是说每个单元格之间会多一个tab,这回导致导出的数据都会是字符串,也就是说导出的表格无法进行公式运算,因为像112这样的数字会在运算时变成“112”。想要解决的话把分割的代码变成$html.= $value[$i].",";就可以了。
2.在构建表格数组时,有的字段位“112,113”这样的,因为中间会有一个逗号,在生成的数组里会变成两个数据,数组长度加一,所以我包这样的数据里的“,”替换成“ ”。