php导出CSV抽象类实例


Posted in PHP onSeptember 24, 2014

本文实例讲述了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 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
PHP 上传文件的方法(类)
Jul 30 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
浅析memcache启动以及telnet命令详解
Jun 28 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
php图片添加文字水印实现代码
Mar 15 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
asp函数split()对应php函数explode()
Feb 27 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
php实现的双向队列类实例
Sep 24 #PHP
php实现的Timer页面运行时间监测类
Sep 24 #PHP
php密码生成类实例
Sep 24 #PHP
PHP中file_get_contents高?用法实例
Sep 24 #PHP
php实现的Cookies操作类实例
Sep 24 #PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 #PHP
php过滤html标记属性类用法实例
Sep 23 #PHP
You might like
Terran历史背景
2020/03/14 星际争霸
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
python二元表达式用法
2019/12/04 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
Python实现壁纸下载与轮换
2020/10/19 Python
python中altair可视化库实例用法
2021/01/26 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
物业公司采购员岗位职责
2013/12/31 职场文书
食品安全责任书
2014/04/15 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
大学毕业生个人总结
2015/02/28 职场文书
2019消防宣传标语!
2019/07/10 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
聊聊Python String型列表求最值的问题
2022/01/18 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫