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);
- } //www.phpfensi.com
- } // 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();
- ?>