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数组
Oct 09 PHP
php网页后退不再出现过期
Mar 08 PHP
晋城吧对DiscuzX进行的前端优化要点
Sep 05 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
解析php中的fopen()函数用打开文件模式说明
Jun 20 PHP
php session_start()出错原因分析及解决方法
Oct 28 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
Mar 28 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
Laravel 前端资源配置教程
Oct 18 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使用curl模拟登录后采集页面的例子
2013/11/04 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
javascript void(0)的妙用
2009/10/21 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
解释&amp;&amp;和||在javascript中的另类用法
2014/07/28 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
Python的Django框架中的Context使用
2015/07/15 Python
python多线程下信号处理程序示例
2019/05/31 Python
python函数定义和调用过程详解
2020/02/09 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
小学防溺水制度
2014/01/29 职场文书
求职自我推荐信
2014/06/25 职场文书
会计学专业求职信
2014/07/17 职场文书
就业意向书范本
2015/05/11 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang