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 相关文章推荐
计数器详细设计
Oct 09 PHP
浅析PHP水印技术
Feb 14 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
PHP json格式和js json格式 js跨域调用实现代码
Sep 08 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
PHP中ini_set和ini_get函数的用法小结
Feb 18 PHP
destoon官方标签大全
Jun 20 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
thinkphp分页实现效果
Oct 13 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
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
python追加元素到列表的方法
2015/07/28 Python
浅析Python编写函数装饰器
2016/03/18 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
Python实现单词翻译功能
2017/06/06 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Python学生信息管理系统修改版
2018/03/13 Python
python生成随机红包的实例写法
2019/09/02 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
python 写一个水果忍者游戏
2021/01/13 Python
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
生产副总岗位职责
2013/11/28 职场文书
高中班长自我鉴定
2013/12/20 职场文书
关于环保的演讲稿
2014/05/10 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
入党积极分子培养人意见
2015/06/02 职场文书