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程序设计有所帮助。