博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 导出CSV抽象类
阅读量:6671 次
发布时间:2019-06-25

本文共 4496 字,大约阅读时间需要 14 分钟。

hot3.png

php 导出CSV抽象类,根据总记录数与每批次记录数,计算总批次,循环导出。避免内存不足的问题。

ExportCSV.class.php

[php]   

  1. <?php  

  2. /** php Export CSV abstract class,根据总记录数与每批次记录数,计算总批次,循环导出。 

  3. *   Date:   2014-05-16 

  4. *   Author: fdipzone 

  5. *   Ver:    1.0 

  6. * 

  7. *   Func: 

  8. *   public  setPageSize      设置每批次导出的记录条数 

  9. *   public  setExportName    设置导出的文件名 

  10. *   public  setSeparator     设置分隔符 

  11. *   public  setDelimiter     设置定界符 

  12. *   public  export           执行导出 

  13. *   private getPageCount     计算导出总批次 

  14. *   private setHeader        设置导出文件header 

  15. *   private formatCSV        将数据格式化为csv格式 

  16. *   private escape           转义字符串 

  17. *   abstract getExportTotal  获取总记录条数,抽象方法,需继承类实现 

  18. *   abstract getExportFields 获取导出的列名,抽象方法,需继承类实现 

  19. *   abstract getExportData   获取每页记录,抽象方法,需继承类实现 

  20. */  

  21.   

  22. abstract class ExportCSV{ // class start  

  23.   

  24.     // 定义子类必须要实现的方法  

  25.       

  26.     /** 获取总记录条数 

  27.     * @return int 

  28.     */  

  29.     abstract protected function getExportTotal();  

  30.   

  31.     /** 获取导出的列名 

  32.     * @return Array 

  33.     */  

  34.     abstract protected function getExportFields();  

  35.   

  36.     /** 获取每批次数据 

  37.     * @param  int $offset 偏移量 

  38.     * @param  int $limit  获取的记录条数 

  39.     * @return Array 

  40.     */  

  41.     abstract protected function getExportData($offset$limit);  

  42.   

  43.   

  44.     // 定义类属性  

  45.     protected $total = 0;                 // 总记录数  

  46.     protected $pagesize = 500;            // 每批次导出的记录数  

  47.     protected $exportName = 'export.csv'// 导出的文件名  

  48.     protected $separator = ',';           // 设置分隔符  

  49.     protected $delimiter = '"';           // 设置定界符  

  50.   

  51.   

  52.     /** 设置每次导出的记录条数 

  53.     * @param int $pagesize 每次导出的记录条数 

  54.     */  

  55.     public function setPageSize($pagesize=0){  

  56.         if(is_numeric($pagesize) && $pagesize>0){  

  57.             $this->pagesize = $pagesize;  

  58.         }  

  59.     }  

  60.   

  61.   

  62.     /** 设置导出的文件名 

  63.     * @param String $filename 导出的文件名 

  64.     */  

  65.     public function setExportName($filename){  

  66.         if($filename!=''){  

  67.             $this->exportName = $filename;  

  68.         }  

  69.     }  

  70.   

  71.   

  72.     /** 设置分隔符 

  73.     * @param String $separator 分隔符 

  74.     */  

  75.     public function setSeparator($separator){  

  76.         if($separator!=''){  

  77.             $this->separator = $separator;  

  78.         }  

  79.     }  

  80.   

  81.   

  82.     /** 设置定界符 

  83.     * @param String $delimiter 定界符 

  84.     */  

  85.     public function setDelimiter($delimiter){  

  86.         if($delimiter!=''){  

  87.             $this->delimiter = $delimiter;  

  88.         }  

  89.     }  

  90.   

  91.   

  92.     /** 导出csv */  

  93.     public function export(){  

  94.   

  95.         // 获取总记录数  

  96.         $this->total = $this->getExportTotal();  

  97.   

  98.         // 没有记录  

  99.         if(!$this->total){  

  100.             return false;  

  101.         }  

  102.   

  103.         // 计算导出总批次  

  104.         $pagecount = $this->getPageCount();  

  105.   

  106.         // 获取导出的列名  

  107.         $fields = $this->getExportFields();  

  108.   

  109.         // 设置导出文件header  

  110.         $this->setHeader();  

  111.   

  112.         // 循环导出  

  113.         for($i=0; $i<$pagecount$i++){  

  114.   

  115.             $exportData = '';  

  116.   

  117.             if($i==0){ // 第一条记录前先导出列名  

  118.                 $exportData .= $this->formatCSV($fields);  

  119.             }  

  120.   

  121.             // 设置偏移值  

  122.             $offset = $i*$this->pagesize;  

  123.   

  124.             // 获取每页数据  

  125.             $data = $this->getExportData($offset$this->pagesize);  

  126.   

  127.             // 将每页数据转换为csv格式  

  128.             if($data){  

  129.                 foreach($data as $row){  

  130.                     $exportData .= $this->formatCSV($row);  

  131.                 }  

  132.             }  

  133.   

  134.             // 导出数据  

  135.             echo $exportData;  

  136.         }  

  137.   

  138.     }  

  139.   

  140.   

  141.     /** 计算总批次 */  

  142.     private function getPageCount(){  

  143.         $pagecount = (int)(($this->total-1)/$this->pagesize)+1;  

  144.         return $pagecount;  

  145.     }  

  146.   

  147.   

  148.     /** 设置导出文件header */  

  149.     private function setHeader(){  

  150.         header('content-type:application/x-msexcel');  

  151.   

  152.         $ua = $_SERVER['HTTP_USER_AGENT'];  

  153.   

  154.         if(preg_match("/MSIE/"$ua)){  

  155.             header('content-disposition:attachment; filename="'.rawurlencode($this->exportName).'"');  

  156.         }elseif(preg_match("/Firefox/"$ua)){  

  157.             header("content-disposition:attachment; filename*=\"utf8''".$this->exportName.'"');  

  158.         }else{  

  159.             header('content-disposition:attachment; filename="'.$this->exportName.'"');  

  160.         }  

  161.   

  162.         ob_end_flush();  

  163.         ob_implicit_flush(true);  

  164.     }  

  165.   

  166.   

  167.     /** 格式化为csv格式数据 

  168.     * @param Array $data 要转换为csv格式的数组 

  169.     */  

  170.     private function formatCSV($data=array()){  

  171.         // 对数组每个元素进行转义  

  172.         $data = array_map(array($this,'escape'), $data);  

  173.         return $this->delimiter.implode($this->delimiter.$this->separator.$this->delimiter, $data).$this->delimiter."\r\n";  

  174.     }  

  175.   

  176.   

  177.     /** 转义字符串 

  178.     * @param  String $str 

  179.     * @return String 

  180.     */  

  181.     private function escape($str){  

  182.         return str_replace($this->delimiter, $this->delimiter.$this->delimiter, $str);  

  183.     }  

  184.   

  185. // class end  

  186.   

  187. ?>  

demo

[php]   

  1. <?php  

  2.   

  3. // ExportCSV abstract class  

  4. require "ExportCSV.class.php";  

  5.   

  6. // 定义继承类  

  7. class myexport extends ExportCSV{  

  8.   

  9.     // 要导出的数据,实际情况会从db读取  

  10.     protected $data = array(  

  11.         array('1','傲雪星枫"','男'),  

  12.         array('2','傲雪星枫","','男'),  

  13.         array('3','傲雪星枫","','男'),  

  14.         array('4',"傲雪星枫\"\"\r\n换行",'男'),  

  15.         array('5','傲雪星枫,,','男'),  

  16.         array('6','傲雪星枫"','男'),  

  17.         array('7','傲雪星枫','男'),  

  18.         array('8','傲雪星枫','男'),  

  19.         array('9','傲雪星枫','男'),  

  20.         array('10','傲雪星枫','男')  

  21.     );  

  22.   

  23.     /* 返回总导出记录数 

  24.     * @return int 

  25.     */  

  26.     protected function getExportTotal(){  

  27.         return count($this->data);  

  28.     }  

  29.   

  30.     /** 返回导出的列名 

  31.     * @return Array 

  32.     */  

  33.     protected function getExportFields(){  

  34.         $title = array('id','name','gender');  

  35.         return $title;  

  36.     }  

  37.   

  38.     /* 返回每批次的记录 

  39.     * @param  int $offset 偏移量 

  40.     * @param  int $limit  获取的记录条数 

  41.     * @return Array 

  42.     */  

  43.     protected function getExportData($offset$limit){  

  44.         return array_slice($this->data, $offset$limit);  

  45.     }  

  46.   

  47. }  

  48.   

  49. // 导出  

  50. $obj = new myexport();  

  51. $obj->setPageSize(1);  

  52. $obj->setExportName('myexport.csv');  

  53. $obj->setSeparator(',');  

  54. $obj->setDelimiter('"');  

  55. $obj->export();  

  56.   

  57. ?>  

源码下载地址:

转载于:https://my.oschina.net/yonghan/blog/468347

你可能感兴趣的文章
对象引论
查看>>
Jdk1.8新特性学习(Optional)
查看>>
聊聊flink taskmanager的jvm-exit-on-oom配置
查看>>
165. Compare Version Numbers
查看>>
ESMap+Html5+SpringBoot+FastDFS实现导航导购App
查看>>
CentOS7搭建LNMP--编译安装
查看>>
C++编译器优化
查看>>
golang slice append 后 capacity 增长的算法
查看>>
MP3转换AAC格式哪个音频转换器好
查看>>
黑苹果装机记录
查看>>
2018-2019年中国CDN市场发展报告:阿里云成为中国CDN市场的领军者
查看>>
教你如何快速将音频文件AAC转换成MP3格式
查看>>
Web前端开发标准规范
查看>>
如何导入golang.org的包
查看>>
软件测试的艺术第六章总结
查看>>
有关微信域名被拦截的经验分享
查看>>
常用数据结构
查看>>
在Antd-Pro下实现文件下载
查看>>
基于Nodejs的前端灰度发布方案_20190228
查看>>
解决Jenkins可选插件列表为空提示“connect time out”问题
查看>>