php 導出CSV抽象類

php 導出CSV抽象類,根據總記錄數與每批次記錄數,計算總批次,循環導出。避免內存不足的問題。php


ExportCSV.class.php數組

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片app

  1. <?php  ui

  2. /** php Export CSV abstract class,根據總記錄數與每批次記錄數,計算總批次,循環導出。 this

  3. *   Date:   2014-05-16 url

  4. *   Author: fdipzone spa

  5. *   Ver:    1.0 .net

  6. * excel

  7. *   Func: code

  8. *   public  setPageSize      設置每批次導出的記錄條數 

  9. *   public  setExportName    設置導出的文件名 

  10. *   public  setSeparator     設置分隔符 

  11. *   public  setDelimiter     設置定界符 

  12. *   public  export           執行導出 

  13. *   private getPageCount     計算導出總批次 

  14. *   private setHeader        設置導出文件header 

  15. *   private formatCSV        將數據格式化爲csv格式 

  16. *   private escape           轉義字符串 

  17. *   abstract getExportTotal  獲取總記錄條數,抽象方法,需繼承類實現 

  18. *   abstract getExportFields 獲取導出的列名,抽象方法,需繼承類實現 

  19. *   abstract getExportData   獲取每頁記錄,抽象方法,需繼承類實現 

  20. */  

  21.   

  22. abstract class ExportCSV{ // class start  

  23.   

  24.     // 定義子類必需要實現的方法  

  25.       

  26.     /** 獲取總記錄條數 

  27.     * @return int 

  28.     */  

  29.     abstract protected function getExportTotal();  

  30.   

  31.     /** 獲取導出的列名 

  32.     * @return Array 

  33.     */  

  34.     abstract protected function getExportFields();  

  35.   

  36.     /** 獲取每批次數據 

  37.     * @param  int $offset 偏移量 

  38.     * @param  int $limit  獲取的記錄條數 

  39.     * @return Array 

  40.     */  

  41.     abstract protected function getExportData($offset$limit);  

  42.   

  43.   

  44.     // 定義類屬性  

  45.     protected $total = 0;                 // 總記錄數  

  46.     protected $pagesize = 500;            // 每批次導出的記錄數  

  47.     protected $exportName = 'export.csv'// 導出的文件名  

  48.     protected $separator = ',';           // 設置分隔符  

  49.     protected $delimiter = '"';           // 設置定界符  

  50.   

  51.   

  52.     /** 設置每次導出的記錄條數 

  53.     * @param int $pagesize 每次導出的記錄條數 

  54.     */  

  55.     public function setPageSize($pagesize=0){  

  56.         if(is_numeric($pagesize) && $pagesize>0){  

  57.             $this->pagesize = $pagesize;  

  58.         }  

  59.     }  

  60.   

  61.   

  62.     /** 設置導出的文件名 

  63.     * @param String $filename 導出的文件名 

  64.     */  

  65.     public function setExportName($filename){  

  66.         if($filename!=''){  

  67.             $this->exportName = $filename;  

  68.         }  

  69.     }  

  70.   

  71.   

  72.     /** 設置分隔符 

  73.     * @param String $separator 分隔符 

  74.     */  

  75.     public function setSeparator($separator){  

  76.         if($separator!=''){  

  77.             $this->separator = $separator;  

  78.         }  

  79.     }  

  80.   

  81.   

  82.     /** 設置定界符 

  83.     * @param String $delimiter 定界符 

  84.     */  

  85.     public function setDelimiter($delimiter){  

  86.         if($delimiter!=''){  

  87.             $this->delimiter = $delimiter;  

  88.         }  

  89.     }  

  90.   

  91.   

  92.     /** 導出csv */  

  93.     public function export(){  

  94.   

  95.         // 獲取總記錄數  

  96.         $this->total = $this->getExportTotal();  

  97.   

  98.         // 沒有記錄  

  99.         if(!$this->total){  

  100.             return false;  

  101.         }  

  102.   

  103.         // 計算導出總批次  

  104.         $pagecount = $this->getPageCount();  

  105.   

  106.         // 獲取導出的列名  

  107.         $fields = $this->getExportFields();  

  108.   

  109.         // 設置導出文件header  

  110.         $this->setHeader();  

  111.   

  112.         // 循環導出  

  113.         for($i=0; $i<$pagecount$i++){  

  114.   

  115.             $exportData = '';  

  116.   

  117.             if($i==0){ // 第一條記錄前先導出列名  

  118.                 $exportData .= $this->formatCSV($fields);  

  119.             }  

  120.   

  121.             // 設置偏移值  

  122.             $offset = $i*$this->pagesize;  

  123.   

  124.             // 獲取每頁數據  

  125.             $data = $this->getExportData($offset$this->pagesize);  

  126.   

  127.             // 將每頁數據轉換爲csv格式  

  128.             if($data){  

  129.                 foreach($data as $row){  

  130.                     $exportData .= $this->formatCSV($row);  

  131.                 }  

  132.             }  

  133.   

  134.             // 導出數據  

  135.             echo $exportData;  

  136.         }  

  137.   

  138.     }  

  139.   

  140.   

  141.     /** 計算總批次 */  

  142.     private function getPageCount(){  

  143.         $pagecount = (int)(($this->total-1)/$this->pagesize)+1;  

  144.         return $pagecount;  

  145.     }  

  146.   

  147.   

  148.     /** 設置導出文件header */  

  149.     private function setHeader(){  

  150.         header('content-type:application/x-msexcel');  

  151.   

  152.         $ua = $_SERVER['HTTP_USER_AGENT'];  

  153.   

  154.         if(preg_match("/MSIE/"$ua)){  

  155.             header('content-disposition:attachment; filename="'.rawurlencode($this->exportName).'"');  

  156.         }elseif(preg_match("/Firefox/"$ua)){  

  157.             header("content-disposition:attachment; filename*=\"utf8''".$this->exportName.'"');  

  158.         }else{  

  159.             header('content-disposition:attachment; filename="'.$this->exportName.'"');  

  160.         }  

  161.   

  162.         ob_end_flush();  

  163.         ob_implicit_flush(true);  

  164.     }  

  165.   

  166.   

  167.     /** 格式化爲csv格式數據 

  168.     * @param Array $data 要轉換爲csv格式的數組 

  169.     */  

  170.     private function formatCSV($data=array()){  

  171.         // 對數組每一個元素進行轉義  

  172.         $data = array_map(array($this,'escape'), $data);  

  173.         return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r\n";  

  174.     }  

  175.   

  176.   

  177.     /** 轉義字符串 

  178.     * @param  String $str 

  179.     * @return String 

  180.     */  

  181.     private function escape($str){  

  182.         return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str);  

  183.     }  

  184.   

  185. // class end  

  186.   

  187. ?>  


demo

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. <?php  

  2.   

  3. // ExportCSV abstract class  

  4. require "ExportCSV.class.php";  

  5.   

  6. // 定義繼承類  

  7. class myexport extends ExportCSV{  

  8.   

  9.     // 要導出的數據,實際狀況會從db讀取  

  10.     protected $data = array(  

  11.         array('1','傲雪星楓"','男'),  

  12.         array('2','傲雪星楓","','男'),  

  13.         array('3','傲雪星楓","','男'),  

  14.         array('4',"傲雪星楓\"\"\r\n換行",'男'),  

  15.         array('5','傲雪星楓,,','男'),  

  16.         array('6','傲雪星楓"','男'),  

  17.         array('7','傲雪星楓','男'),  

  18.         array('8','傲雪星楓','男'),  

  19.         array('9','傲雪星楓','男'),  

  20.         array('10','傲雪星楓','男')  

  21.     );  

  22.   

  23.     /* 返回總導出記錄數 

  24.     * @return int 

  25.     */  

  26.     protected function getExportTotal(){  

  27.         return count($this->data);  

  28.     }  

  29.   

  30.     /** 返回導出的列名 

  31.     * @return Array 

  32.     */  

  33.     protected function getExportFields(){  

  34.         $title = array('id','name','gender');  

  35.         return $title;  

  36.     }  

  37.   

  38.     /* 返回每批次的記錄 

  39.     * @param  int $offset 偏移量 

  40.     * @param  int $limit  獲取的記錄條數 

  41.     * @return Array 

  42.     */  

  43.     protected function getExportData($offset$limit){  

  44.         return array_slice($this->data, $offset$limit);  

  45.     }  

  46.   

  47. }  

  48.   

  49. // 導出  

  50. $obj = new myexport();  

  51. $obj->setPageSize(1);  

  52. $obj->setExportName('myexport.csv');  

  53. $obj->setSeparator(',');  

  54. $obj->setDelimiter('"');  

  55. $obj->export();  

  56.   

  57. ?>  


源碼下載地址:點擊查看

相關文章
相關標籤/搜索