php教程

超轻量级php框架startmvc

php导出CSV抽象类实例

更新时间:2020-02-28 00:25:52 作者:startmvc
php导出CSV抽象类实例 更新时间:2014年09月24日 15:03:16 投稿:shichen2014 我要评论这篇文章主要介绍了php导出CSV抽象类及其用法示例,可实现循环导出功能,从而避免内存不足的问题,需要的朋友可以参考下本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考。具体分析如下:该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程序设计有所帮助。

php 导出 CSV 抽象