php 匯出CSV抽象類別

來源:互聯網
上載者:User
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\n";    }    /** 逸出字元串    * @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 classrequire "ExportCSV.class.php";// 定義繼承類class myexport extends ExportCSV{    // 要匯出的資料,實際情況會從db讀取    protected $data = array(        array('1','傲雪星楓"','男'),        array('2','傲雪星楓","','男'),        array('3','傲雪星楓","','男'),        array('4',"傲雪星楓\"\"\r\n換行",'男'),        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();?>


以上就是php 匯出CSV抽象類別的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.