欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php导出CSV抽象类实例

程序员文章站 2022-05-24 17:38:03
本文实例讲述了php导出csv抽象类及其应用,分享给大家供大家参考。具体分析如下: 该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程序设计有所帮助。