Thinkphp解決phpExcel導出數據量大導致內存溢出


工作需要導出幾萬的數據量。操作比較頻繁。之前數據在七八千是數據導出很慢。phpExcel是方便但是性能一般。現在改為使用csv導出數據;可以緩解內存壓力,一次導出兩三萬是沒問題的。當然服務器內存給力,加上數據庫優化相信這個還是比較方便的。

具體方法如下:

在Think文件下新建Csv.class,php

<?php
namespace Think;
class Csv
{
   //導出csv文件
   public function put_csv($list,$title){
       $file_name="CSV".date("mdHis",time()).".csv";
       header ( 'Content-Type: application/vnd.ms-excel' );
       header ( 'Content-Disposition: attachment;filename='.$file_name );
       header ( 'Cache-Control: max-age=0' );
       $file = fopen('php://output',"a");
       $limit=1000;
       $calc=0;
       foreach ($title as $v){
          $tit[]=iconv('UTF-8', 'GB2312//IGNORE',$v);
       }
       fputcsv($file,$tit);
       foreach ($list as $v){
          $calc++;
          if($limit==$calc){
             ob_flush();
             flush();
             $calc=0;
          }
          foreach ($v as $t){
             $tarr[]=iconv('UTF-8', 'GB2312//IGNORE',$t);
          }
          fputcsv($file,$tarr);
          unset($tarr);
       }
       unset($list);
       fclose($file);
       exit();
   }
}
?>

然后在控制器引入,使用命名空間即可:

use Think\Csv;

最后是:

數據庫查出的字段順序很重要,字段循序對應excel列的順序。

$csv = new Csv();
$csv_title  = array("字段一","字段二",...);
$csv->put_csv($list,$csv_title);

 $list是select處的二維數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM