php导出CSV抽象类实例

5年以前  |  阅读数:938 次  |  编程语言:PHP 

本文实例讲述了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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例