php导出csv报表

最近系统有一个导出报表功能,之前是导出的.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 = "\xEF\xBB\xBF";

/*输出表头*/
foreach ($tableheader as $value) {
    $html.= $value."\t,";
}
$html.= "\n";

/*输出内容*/
foreach ($data as $value) {
    for ($i = 0; $i < $tablelength; $i++) {
        $html.= $value[$i].",";
    }
    $html.= $value['createtime'].",";
    $html.= "\n";
}
//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”这样的,因为中间会有一个逗号,在生成的数组里会变成两个数据,数组长度加一,所以我包这样的数据里的“,”替换成“ ”。

posted @ 2017-10-30 19:25  元庆  阅读(325)  评论(0编辑  收藏  举报