php CSV抽象クラスのエクスポート


phpはCSV抽象クラスを導出し,総記録数とロット毎記録数から総ロットを算出し,循環導出する.メモリ不足の問題を回避します.
ExportCSV.class.php
<?php
/** php Export CSV abstract class,             ,     ,    。
*   Date:   2014-05-16
*   Author: fdipzone
*   Ver:    1.0
*
*   Func:
*   public  setPageSize                  
*   public  setExportName            
*   public  setSeparator          
*   public  setDelimiter          
*   public  export               
*   private getPageCount            
*   private setHeader              header
*   private formatCSV               csv  
*   private escape                
*   abstract getExportTotal         ,    ,      
*   abstract getExportFields        ,    ,      
*   abstract getExportData         ,    ,      
*/

abstract class ExportCSV{ // class start

    //             
    
    /**        
    * @return int
    */
    abstract protected function getExportTotal();

    /**        
    * @return Array
    */
    abstract protected function getExportFields();

    /**        
    * @param  int $offset    
    * @param  int $limit         
    * @return Array
    */
    abstract protected function getExportData($offset, $limit);


    //      
    protected $total = 0;                 //     
    protected $pagesize = 500;            //          
    protected $exportName = 'export.csv'; //       
    protected $separator = ',';           //      
    protected $delimiter = '"';           //      


    /**            
    * @param int $pagesize          
    */
    public function setPageSize($pagesize=0){
        if(is_numeric($pagesize) && $pagesize>0){
            $this->pagesize = $pagesize;
        }
    }


    /**         
    * @param String $filename       
    */
    public function setExportName($filename){
        if($filename!=''){
            $this->exportName = $filename;
        }
    }


    /**      
    * @param String $separator    
    */
    public function setSeparator($separator){
        if($separator!=''){
            $this->separator = $separator;
        }
    }


    /**      
    * @param String $delimiter    
    */
    public function setDelimiter($delimiter){
        if($delimiter!=''){
            $this->delimiter = $delimiter;
        }
    }


    /**   csv */
    public function export(){

        //       
        $this->total = $this->getExportTotal();

        //     
        if(!$this->total){
            return false;
        }

        //        
        $pagecount = $this->getPageCount();

        //        
        $fields = $this->getExportFields();

        //       header
        $this->setHeader();

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

            $exportData = '';

            if($i==0){ //            
                $exportData .= $this->formatCSV($fields);
            }

            //      
            $offset = $i*$this->pagesize;

            //       
            $data = $this->getExportData($offset, $this->pagesize);

            //         csv  
            if($data){
                foreach($data as $row){
                    $exportData .= $this->formatCSV($row);
                }
            }

            //     
            echo $exportData;
        }

    }


    /**       */
    private function getPageCount(){
        $pagecount = (int)(($this->total-1)/$this->pagesize)+1;
        return $pagecount;
    }


    /**       header */
    private function setHeader(){
        header('content-type:application/x-msexcel');

        $ua = $_SERVER['HTTP_USER_AGENT'];

        if(preg_match("/MSIE/", $ua)){
            header('content-disposition:attachment; filename="'.rawurlencode($this->exportName).'"');
        }elseif(preg_match("/Firefox/", $ua)){
            header("content-disposition:attachment; filename*=\"utf8''".$this->exportName.'"');
        }else{
            header('content-disposition:attachment; filename="'.$this->exportName.'"');
        }

        ob_end_flush();
        ob_implicit_flush(true);
    }


    /**     csv    
    * @param Array $data     csv     
    */
    private function formatCSV($data=array()){
        //            
        $data = array_map(array($this,'escape'), $data);
        return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r
"; } /** * @param String $str * @return String */ private function escape($str){ return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str); } } // class end ?>

demo
<?php

// ExportCSV abstract class
require "ExportCSV.class.php";

//      
class myexport extends ExportCSV{

    //       ,      db  
    protected $data = array(
        array('1','    "',' '),
        array('2','    ","',' '),
        array('3','    ","',' '),
        array('4',"    \"\"\r
",' '), array('5',' ,,',' '), array('6',' "',' '), array('7',' ',' '), array('8',' ',' '), array('9',' ',' '), array('10',' ',' ') ); /* * @return int */ protected function getExportTotal(){ return count($this->data); } /** * @return Array */ protected function getExportFields(){ $title = array('id','name','gender'); return $title; } /* * @param int $offset * @param int $limit * @return Array */ protected function getExportData($offset, $limit){ return array_slice($this->data, $offset, $limit); } } // $obj = new myexport(); $obj->setPageSize(1); $obj->setExportName('myexport.csv'); $obj->setSeparator(','); $obj->setDelimiter('"'); $obj->export(); ?>

ソースのダウンロードアドレス:クリックして表示