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 相关文章推荐
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
PHP取进制余数函数代码
Jan 19 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
php define的第二个参数使用方法
Nov 04 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 PHP
PHP冒泡算法详解(递归实现)
Nov 10 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 PHP
php swoft框架实例用法
Dec 22 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php的memcached客户端memcached
2011/06/14 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
使用graphics.py实现2048小游戏
2015/03/10 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
python实现连连看游戏
2020/02/14 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
Python flask框架端口失效解决方案
2020/06/04 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
三万活动总结
2014/04/28 职场文书
大学生自荐材料范文
2014/12/30 职场文书
城管年度个人总结
2015/02/28 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Elasticsearch 配置详解
2022/04/19 Java/Android
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python