当前位置:首页 > PHP教程 > php类库 > 列表

php导出CSV抽象类实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-14 15:31:48 浏览: 评论:0 

这篇文章主要介绍了php导出CSV抽象类及其用法示例,可实现循环导出功能,从而避免内存不足的问题,需要的朋友可以参考下。

本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考。具体分析如下:

该php导出CSV抽象类,可根据总记录数与每批次记录数,计算总批次,循环导出。避免内存不足的问题。

ExportCSV.class.php类文件如下:

  1. <?php  
  2. /** php Export CSV abstract class,根据总记录数与每批次记录数,计算总批次,循环导出。  
  3. *  Date:  2014-05-16  
  4. *  Author: fdipzone  
  5. *  Ver:  1.0  
  6.  
  7. *  Func:  
  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.   protected $total = 0;         // 总记录数  
  45.   protected $pagesize = 500;      // 每批次导出的记录数  
  46.   protected $exportName = 'export.csv'// 导出的文件名  
  47.   protected $separator = ',';      // 设置分隔符  
  48.   protected $delimiter = '"';      // 设置定界符  
  49.    
  50.    
  51.   /** 设置每次导出的记录条数  
  52.   * @param int $pagesize 每次导出的记录条数  
  53.   */ 
  54.   public function setPageSize($pagesize=0){  
  55.     if(is_numeric($pagesize) && $pagesize>0){  
  56.       $this->pagesize = $pagesize;  
  57.     }  
  58.   }  
  59.    
  60.   /** 设置导出的文件名  
  61.   * @param String $filename 导出的文件名  
  62.   */ 
  63.   public function setExportName($filename){  
  64.     if($filename!=''){  
  65.       $this->exportName = $filename;  
  66.     }  
  67.   }  
  68.    
  69.   /** 设置分隔符  
  70.   * @param String $separator 分隔符  
  71.   */ 
  72.   public function setSeparator($separator){  
  73.     if($separator!=''){  
  74.       $this->separator = $separator;  
  75.     }  
  76.   }  
  77.    
  78.   /** 设置定界符  
  79.   * @param String $delimiter 定界符  
  80.   */ 
  81.   public function setDelimiter($delimiter){  
  82.     if($delimiter!=''){  
  83.       $this->delimiter = $delimiter;  
  84.     }  
  85.   }  
  86.    
  87.   /** 导出csv */ 
  88.   public function export(){  
  89.    
  90.     // 获取总记录数  
  91.     $this->total = $this->getExportTotal();  
  92.    
  93.     // 没有记录  
  94.     if(!$this->total){  
  95.       return false;  
  96.     }  
  97.    
  98.     // 计算导出总批次  
  99.     $pagecount = $this->getPageCount();  
  100.    
  101.     // 获取导出的列名  
  102.     $fields = $this->getExportFields();  
  103.    
  104.     // 设置导出文件header  
  105.     $this->setHeader();  
  106.    
  107.     // 循环导出  
  108.     for($i=0; $i<$pagecount$i++){  
  109.    
  110.       $exportData = '';  
  111.    
  112.       if($i==0){ // 第一条记录前先导出列名  
  113.         $exportData .= $this->formatCSV($fields);  
  114.       }  
  115.    
  116.       // 设置偏移值  
  117.       $offset = $i*$this->pagesize;  
  118.    
  119.       // 获取每页数据  
  120.       $data = $this->getExportData($offset$this->pagesize);  
  121.    
  122.       // 将每页数据转换为csv格式  
  123.       if($data){  
  124.         foreach($data as $row){  
  125.           $exportData .= $this->formatCSV($row);  
  126.         }  
  127.       }  
  128.    
  129.       // 导出数据  
  130.       echo $exportData;  
  131.     }  
  132.   }  
  133.    
  134.   /** 计算总批次 */ 
  135.   private function getPageCount(){  
  136.     $pagecount = (int)(($this->total-1)/$this->pagesize)+1;  
  137.     return $pagecount;  
  138.   }  
  139.    
  140.   /** 设置导出文件header */ 
  141.   private function setHeader(){  
  142.     header('content-type:application/x-msexcel');  
  143.    
  144.     $ua = $_SERVER['HTTP_USER_AGENT'];  
  145.    
  146.     if(preg_match("/MSIE/"$ua)){  
  147.       header('content-disposition:attachment; filename="'.rawurlencode($this->exportName).'"');  
  148.     }elseif(preg_match("/Firefox/"$ua)){  
  149.       header("content-disposition:attachment; filename*=\"utf8''".$this->exportName.'"');  
  150.     }else{  
  151.       header('content-disposition:attachment; filename="'.$this->exportName.'"');  
  152.     }  
  153.    
  154.     ob_end_flush();  
  155.     ob_implicit_flush(true);  
  156.   }  
  157.    
  158.   /** 格式化为csv格式数据  
  159.   * @param Array $data 要转换为csv格式的数组  
  160.   */ 
  161.   private function formatCSV($data=array()){  
  162.     // 对数组每个元素进行转义  
  163.     $data = array_map(array($this,'escape'), $data);  
  164.     return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r\n";  
  165.   }  
  166.    
  167.   /** 转义字符串  
  168.   * @param String $str  
  169.   * @return String  
  170.   */ 
  171.   private function escape($str){  
  172.     return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str);  
  173.   } //www.phpfensi.com 
  174. // class end  
  175.    
  176. ?> 

demo示例程序如下:

  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. $obj = new myexport();  
  50. $obj->setPageSize(1);  
  51. $obj->setExportName('myexport.csv');  
  52. $obj->setSeparator(',');  
  53. $obj->setDelimiter('"');  
  54. $obj->export();  
  55. ?> 

Tags: php导出CSV

分享到: