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)!