热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php导出CSV抽象类实例

这篇文章主要介绍了php导出CSV抽象类及其用法示例,可实现循环导出功能,从而避免内存不足的问题,需要的朋友可以参考下
本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考。具体分析如下:

该php导出CSV抽象类,可根据总记录数与每批次记录数,计算总批次,循环导出。避免内存不足的问题。

ExportCSV.class.php类文件如下:

<&#63;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 
 
&#63;> 

demo示例程序如下:

<&#63;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(); 
&#63;> 

完整实例代码点击此处本站下载。

希望本文所述对大家的PHP程序设计有所帮助。

推荐阅读
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了获取关联数组键的列表的方法,即使用Object.keys()函数。同时还提到了该方法在不同浏览器的支持情况,并附上了一个代码片段供读者参考。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • 场景1.IE,Firefox浏览器访问不了网站,谷歌浏览器可以,返回错误码DNS_PROBE_POSSIBLE.2.pingwww.qq.com可以ping通,ping局域 ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
  • CSS|网格-行-结束属性原文:https://www.gee ... [详细]
author-avatar
BuauOoO_987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有