本文实例讲述了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实现CSV文件的导入和导出类,包括了PHP实现CSV文件的导入和导出类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现CSV文件的导入和导出类。分享给大家供大家参考。具体如下: 希望本文所述对大家的php程序设计有所帮助。
本文向大家介绍PHP 抽象类,包括了PHP 抽象类的使用技巧和注意事项,需要的朋友参考一下 示例 抽象类是无法实例化的类。抽象类可以定义抽象方法,这些方法没有任何主体,只有一个定义: 应该通过子类扩展抽象类,然后可以提供这些抽象方法的实现。 这样的类的主要目的是提供一种模板,该模板允许子类继承,“强制”遵循的结构。让我们用一个例子来详细说明一下: 在此示例中,我们将实现一个Worker接口。首先我
本文向大家介绍php实现CSV文件导入和导出,包括了php实现CSV文件导入和导出的使用技巧和注意事项,需要的朋友参考一下 项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢?本文将使用PHP并结合mysql,实现了CSV格式数据的导入和导出功能。 我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,se
本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面
问题内容: 我创建了一个空的抽象类,并从中继承了该类: 我期望输出是 但是,我得到的是 如果我删除(这样就变成一个普通的类)和/或如果我设置了其他值,问题(显然)就消失了。 这里发生了什么? 问题答案: 这实际上不是ABC的问题,而是PyMongo的问题。有一个关于它的问题在这里。似乎pymongo重写以返回某种数据库类。这意味着将返回一个数据库对象,该对象在布尔上下文中为true。这使ABCMe
问题内容: 假设我有一个数据库…。是否可以通过PHP将数据库中的内容导出到CSV文件(和文本文件,如果可能)? 问题答案: 我个人使用此功能从任何数组创建CSV内容。 然后,您可以使用户使用以下方式下载该文件: 用法示例: