php导出CSV抽象类实例
本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考。具体分析如下:
该php导出CSV抽象类,可根据总记录数与每批次记录数,计算总批次,循环导出。避免内存不足的问题。
ExportCSV.class.php类文件如下:
<?php /**phpExportCSVabstractclass,根据总记录数与每批次记录数,计算总批次,循环导出。 *Date:2014-05-16 *Author:fdipzone *Ver:1.0 * *Func: *publicsetPageSize设置每批次导出的记录条数 *publicsetExportName设置导出的文件名 *publicsetSeparator设置分隔符 *publicsetDelimiter设置定界符 *publicexport执行导出 *privategetPageCount计算导出总批次 *privatesetHeader设置导出文件header *privateformatCSV将数据格式化为csv格式 *privateescape转义字符串 *abstractgetExportTotal获取总记录条数,抽象方法,需继承类实现 *abstractgetExportFields获取导出的列名,抽象方法,需继承类实现 *abstractgetExportData获取每页记录,抽象方法,需继承类实现 */ abstractclassExportCSV{//classstart //定义子类必须要实现的方法 /**获取总记录条数 *@returnint */ abstractprotectedfunctiongetExportTotal(); /**获取导出的列名 *@returnArray */ abstractprotectedfunctiongetExportFields(); /**获取每批次数据 *@paramint$offset偏移量 *@paramint$limit获取的记录条数 *@returnArray */ abstractprotectedfunctiongetExportData($offset,$limit); //定义类属性 protected$total=0;//总记录数 protected$pagesize=500;//每批次导出的记录数 protected$exportName='export.csv';//导出的文件名 protected$separator=',';//设置分隔符 protected$delimiter='"';//设置定界符 /**设置每次导出的记录条数 *@paramint$pagesize每次导出的记录条数 */ publicfunctionsetPageSize($pagesize=0){ if(is_numeric($pagesize)&&$pagesize>0){ $this->pagesize=$pagesize; } } /**设置导出的文件名 *@paramString$filename导出的文件名 */ publicfunctionsetExportName($filename){ if($filename!=''){ $this->exportName=$filename; } } /**设置分隔符 *@paramString$separator分隔符 */ publicfunctionsetSeparator($separator){ if($separator!=''){ $this->separator=$separator; } } /**设置定界符 *@paramString$delimiter定界符 */ publicfunctionsetDelimiter($delimiter){ if($delimiter!=''){ $this->delimiter=$delimiter; } } /**导出csv*/ publicfunctionexport(){ //获取总记录数 $this->total=$this->getExportTotal(); //没有记录 if(!$this->total){ returnfalse; } //计算导出总批次 $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($dataas$row){ $exportData.=$this->formatCSV($row); } } //导出数据 echo$exportData; } } /**计算总批次*/ privatefunctiongetPageCount(){ $pagecount=(int)(($this->total-1)/$this->pagesize)+1; return$pagecount; } /**设置导出文件header*/ privatefunctionsetHeader(){ 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格式数据 *@paramArray$data要转换为csv格式的数组 */ privatefunctionformatCSV($data=array()){ //对数组每个元素进行转义 $data=array_map(array($this,'escape'),$data); return$this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter,$data).$this->delimiter."\r\n"; } /**转义字符串 *@paramString$str *@returnString */ privatefunctionescape($str){ returnstr_replace($this->delimiter,$this->delimiter.$this->delimiter,$str); } }//classend ?>
demo示例程序如下:
<?php //ExportCSVabstractclass require"ExportCSV.class.php"; //定义继承类 classmyexportextendsExportCSV{ //要导出的数据,实际情况会从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','傲雪星枫','男') ); /*返回总导出记录数 *@returnint */ protectedfunctiongetExportTotal(){ returncount($this->data); } /**返回导出的列名 *@returnArray */ protectedfunctiongetExportFields(){ $title=array('id','name','gender'); return$title; } /*返回每批次的记录 *@paramint$offset偏移量 *@paramint$limit获取的记录条数 *@returnArray */ protectedfunctiongetExportData($offset,$limit){ returnarray_slice($this->data,$offset,$limit); } } //导出 $obj=newmyexport(); $obj->setPageSize(1); $obj->setExportName('myexport.csv'); $obj->setSeparator(','); $obj->setDelimiter('"'); $obj->export(); ?>
完整实例代码点击此处本站下载。
希望本文所述对大家的PHP程序设计有所帮助。