php導(dǎo)出CSV抽象類實(shí)例
來(lái)源:易賢網(wǎng) 閱讀:705 次 日期:2014-09-29 12:05:13
溫馨提示:易賢網(wǎng)小編為您整理了“php導(dǎo)出CSV抽象類實(shí)例”,方便廣大網(wǎng)友查閱!

本文實(shí)例講述了php導(dǎo)出CSV抽象類及其應(yīng)用,分享給大家供大家參考。具體分析如下:

該php導(dǎo)出CSV抽象類,可根據(jù)總記錄數(shù)與每批次記錄數(shù),計(jì)算總批次,循環(huán)導(dǎo)出。避免內(nèi)存不足的問(wèn)題。

ExportCSV.class.php類文件如下:

?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 <?php /** php Export CSV abstract class,根據(jù)總記錄數(shù)與每批次記錄數(shù),計(jì)算總批次,循環(huán)導(dǎo)出。 * Date: 2014-05-16 * Author: fdipzone * Ver: 1.0 * * Func: * public setPageSize 設(shè)置每批次導(dǎo)出的記錄條數(shù) * public setExportName 設(shè)置導(dǎo)出的文件名 * public setSeparator 設(shè)置分隔符 * public setDelimiter 設(shè)置定界符 * public export 執(zhí)行導(dǎo)出 * private getPageCount 計(jì)算導(dǎo)出總批次 * private setHeader 設(shè)置導(dǎo)出文件header * private formatCSV 將數(shù)據(jù)格式化為csv格式 * private escape 轉(zhuǎn)義字符串 * abstract getExportTotal 獲取總記錄條數(shù),抽象方法,需繼承類實(shí)現(xiàn) * abstract getExportFields 獲取導(dǎo)出的列名,抽象方法,需繼承類實(shí)現(xiàn) * abstract getExportData 獲取每頁(yè)記錄,抽象方法,需繼承類實(shí)現(xiàn) */ abstract class ExportCSV{ // class start // 定義子類必須要實(shí)現(xiàn)的方法 /** 獲取總記錄條數(shù) * @return int */ abstract protected function getExportTotal(); /** 獲取導(dǎo)出的列名 * @return Array */ abstract protected function getExportFields(); /** 獲取每批次數(shù)據(jù) * @param int $offset 偏移量 * @param int $limit 獲取的記錄條數(shù) * @return Array */ abstract protected function getExportData($offset, $limit); // 定義類屬性 protected $total = 0; // 總記錄數(shù) protected $pagesize = 500; // 每批次導(dǎo)出的記錄數(shù) protected $exportName = 'export.csv'; // 導(dǎo)出的文件名 protected $separator = ','; // 設(shè)置分隔符 protected $delimiter = '"'; // 設(shè)置定界符 /** 設(shè)置每次導(dǎo)出的記錄條數(shù) * @param int $pagesize 每次導(dǎo)出的記錄條數(shù) */ public function setPageSize($pagesize=0){ if(is_numeric($pagesize) && $pagesize>0){ $this->pagesize = $pagesize; } } /** 設(shè)置導(dǎo)出的文件名 * @param String $filename 導(dǎo)出的文件名 */ public function setExportName($filename){ if($filename!=''){ $this->exportName = $filename; } } /** 設(shè)置分隔符 * @param String $separator 分隔符 */ public function setSeparator($separator){ if($separator!=''){ $this->separator = $separator; } } /** 設(shè)置定界符 * @param String $delimiter 定界符 */ public function setDelimiter($delimiter){ if($delimiter!=''){ $this->delimiter = $delimiter; } } /** 導(dǎo)出csv */ public function export(){ // 獲取總記錄數(shù) $this->total = $this->getExportTotal(); // 沒(méi)有記錄 if(!$this->total){ return false; } // 計(jì)算導(dǎo)出總批次 $pagecount = $this->getPageCount(); // 獲取導(dǎo)出的列名 $fields = $this->getExportFields(); // 設(shè)置導(dǎo)出文件header $this->setHeader(); // 循環(huán)導(dǎo)出 for($i=0; $i<$pagecount; $i++){ $exportData = ''; if($i==0){ // 第一條記錄前先導(dǎo)出列名 $exportData .= $this->formatCSV($fields); } // 設(shè)置偏移值 $offset = $i*$this->pagesize; // 獲取每頁(yè)數(shù)據(jù) $data = $this->getExportData($offset, $this->pagesize); // 將每頁(yè)數(shù)據(jù)轉(zhuǎn)換為csv格式 if($data){ foreach($data as $row){ $exportData .= $this->formatCSV($row); } } // 導(dǎo)出數(shù)據(jù) echo $exportData; } } /** 計(jì)算總批次 */ private function getPageCount(){ $pagecount = (int)(($this->total-1)/$this->pagesize)+1; return $pagecount; } /** 設(shè)置導(dǎo)出文件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格式數(shù)據(jù) * @param Array $data 要轉(zhuǎn)換為csv格式的數(shù)組 */ private function formatCSV($data=array()){ // 對(duì)數(shù)組每個(gè)元素進(jìn)行轉(zhuǎn)義 $data = array_map(array($this,'escape'), $data); return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r\n"; } /** 轉(zhuǎn)義字符串 * @param String $str * @return String */ private function escape($str){ return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str); } } // class end ?>

demo示例程序如下:

?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 <?php // ExportCSV abstract class require "ExportCSV.class.php"; // 定義繼承類 class myexport extends ExportCSV{ // 要導(dǎo)出的數(shù)據(jù),實(shí)際情況會(huì)從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','傲雪星楓','男') ); /* 返回總導(dǎo)出記錄數(shù) * @return int */ protected function getExportTotal(){ return count($this->data); } /** 返回導(dǎo)出的列名 * @return Array */ protected function getExportFields(){ $title = array('id','name','gender'); return $title; } /* 返回每批次的記錄 * @param int $offset 偏移量 * @param int $limit 獲取的記錄條數(shù) * @return Array */ protected function getExportData($offset, $limit){ return array_slice($this->data, $offset, $limit); } } // 導(dǎo)出 $obj = new myexport(); $obj->setPageSize(1); $obj->setExportName('myexport.csv'); $obj->setSeparator(','); $obj->setDelimiter('"'); $obj->export(); ?>

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:php導(dǎo)出CSV抽象類實(shí)例
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)