php导出CSV抽象类实例

本文实例讲述了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/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 class require "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程序设计有所帮助。

php技术php导出CSV抽象类实例,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。