php导出CSV抽象类实例

学习笔记 2020/11/25 PHP

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

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

ExportCSV.class.php类文件如下:

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示例程序如下:

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程序设计有所帮助。

本文地址:https://www.stayed.cn/item/297

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。