php导出CSV抽象类实例

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • 详解PHP导入导出CSV文件

    我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. 复制代码 代码如下: CREATE TABLE `student` (       `id` int(11) NOT NULL auto_increment,       `name` varchar(50) NOT NULL,       `sex` varchar(10) NOT NULL,       `age` smallint(3) NO

  • php导出csv数据在浏览器中输出提供下载或保存到文件的示例

    1.在浏览器输出提供下载 复制代码 代码如下: /** * 导出数据到CSV文件 * @param array $data  数据 * @param array $title_arr 标题 * @param string $file_name CSV文件名 */function export_csv(&$data, $title_arr, $file_name = '') {    ini_set("max_execution_time", "3600");

  • php导出csv文件,可导出前导0实例代码

    实例一:可导出前导0 //导出csv格式文件 $data数据 $title_arr标题 $file_name文件名 function exportCsv($data,$title_arr,$file_name=''){ ini_set("max_execution_time", "3600"); $csv_data = ''; /** 标题 */ $nums = count($title_arr); for ($i = 0; $i < $nums - 1; +

  • php导出CSV抽象类实例

    本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考.具体分析如下: 该php导出CSV抽象类,可根据总记录数与每批次记录数,计算总批次,循环导出.避免内存不足的问题. ExportCSV.class.php类文件如下: <?php /** php Export CSV abstract class,根据总记录数与每批次记录数,计算总批次,循环导出. * Date: 2014-05-16 * Author: fdipzone * Ver: 1.0 * * Func: * publi

  • JAVA导出CSV文件实例教程

    以前导出总是用POI导出为Excel文件,后来当我了解到CSV以后,我发现速度飞快. 如果导出的数据不要求格式.样式.公式等等,建议最好导成CSV文件,因为真的很快. 虽然我们可以用Java再带的文件相关的类去操作以生成一个CSV文件,但事实上有好多第三方类库也提供了类似的功能. 这里我们使用apache提供的commons-csv组件 Commons CSV 文档在这里 http://commons.apache.org/ http://commons.apache.org/proper/co

  • Python简单爬虫导出CSV文件的实例讲解

    流程:模拟登录→获取Html页面→正则解析所有符合条件的行→逐一将符合条件的行的所有列存入到CSVData[]临时变量中→写入到CSV文件中 核心代码: ####写入Csv文件中 with open(self.CsvFileName, 'wb') as csvfile: spamwriter = csv.writer(csvfile, dialect='excel') #设置标题 spamwriter.writerow(["游戏账号","用户类型","游戏

  • MongoDB单表数据的导出和恢复实例讲解

    MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB 工作在收集和文件的概念. 数据库 数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的文件.一个单一的MongoDB服务器通常有多个数据库. 集合 集合是一组MongoDB的文档.它相当于一个RDBMS表.收集存在于一个单一的数据库.集合不执行模式.集合内的文档可以有不同的领域.通常情况下,一个集合中的所有文件是相同或相关的目的. 文档 文档是一组键 - 值对.文件动态模式.动态模式

  • 应用Java泛型和反射导出CSV文件的方法

    本文实例讲述了应用Java泛型和反射导出CSV文件的方法.分享给大家供大家参考.具体如下: 项目中有需求要把数据导出为CSV文件,因为不同的类有不同的属性,为了代码简单,应用Java的泛型和反射,写了一个函数,完成导出功能. 复制代码 代码如下: public <T> void saveFile(List<T> list, String outFile) throws IOException {         if (list == null || list.isEmpty())

  • Yii框架扩展CGridView增加导出CSV功能的方法

    本文实例讲述了Yii框架扩展CGridView增加导出CSV功能的方法.分享给大家供大家参考,具体如下: Yii提供的CGridView组件没有内置数据导出功能,不过我们可以通过扩展该组件来添加该功能. 具体方法如下: 1.首先派生一个子类,添加一个action成员,在该视图的init函数中判断是浏览动作还是数据导出动作,如果是浏览动作者则保持默认行为,否则输出csv文件. public function init() { if($this->action == 'export') { pare

  • python技能之数据导出excel的实例代码

    本文介绍了python技能之导出excel的实例代码,正好能用到,写出来分享给大家 作为一个数据分析师,下面的需求是经常会遇到的. 从数据库或者现有的文本文件中提取符合要求的数据,做一个二次处理,处理完成后的数据最终存储到excel表格中供其他部门的人继续二次分析. 在这里Excel作为一个必不可少桥梁,合适的工具和方法可以避免我们将处理完的数据耗费时间一行行复制黏贴过去. python编程也是一个数据分析师的必备技能,你永远无法预料你的数据会来自哪里,需要经过怎样复杂的过滤,筛选,排序,组合处

  • mysql 导出CSV文件 并带表头的方法

    参考官方文档 http://dev.mysql.com/doc/refman/5.7/en/select-into.html mysql> select game,domain,type -> into outfile 'd:\\game.csv' -> fields terminated by ',' -> lines terminated by '\n' -> from game_lists limit 10; 实例如下: mysql> create table t

  • thinkPHP导出csv文件及用表格输出excel的方法

    本文实例讲述了thinkPHP导出csv文件及用表格输出excel的方法.分享给大家供大家参考,具体如下: 1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this->display(),最后细心看到think_page_trace这样的字样,恍然大悟,是页面的跟踪日志,这个默认是会输出来的.最后在方法后面加了一个exit结束就好了,下面是代码: 1.I

随机推荐