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
		// 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/PHP/
        $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
, 内存
, 循环
, csv
, 抽象
, 根据
php导出csv
php 导出csv、php导出csv文件、php 导出csv 乱码、php 导出csv 中文乱码、phpexcel导出csv,以便于您获取更多的相关知识。

时间: 2024-12-29 05:45:15

php的导出CSV抽象类的相关文章

php导出CSV抽象类实例_php技巧

本文实例讲述了php导出CSV抽象类及其应用,分享给大家供大家参考.具体分析如下: 该php导出CSV抽象类,可根据总记录数与每批次记录数,计算总批次,循环导出.避免内存不足的问题. ExportCSV.class.php类文件如下: <?php /** php Export CSV abstract class,根据总记录数与每批次记录数,计算总批次,循环导出. * Date: 2014-05-16 * Author: fdipzone * Ver: 1.0 * * Func: * publi

Web端导出CSV

前端导出文件大部分还是通过服务器端的方式生成文件,然后传递到客户端.但很多情况下当我们导出CSV时并不需要后端参与,甚至没有后端. 做过WebGIS的同学经常会碰到这种场景,用户的兴趣点数据以csv文件形式上传到web应用中以表格形式展示,并可以编辑属性信息,编辑完成后需要将数据下载到本地.特别是对一些敏感数据,用户不希望传递到应用服务器端,整个过程完全在客户端进行. 上传过程我们暂且不讨论,只讨论生成CSV以及下载过程. CSV的生成 问题一:如何分行分列? 思路:分行使用"\n",

解决PHP导出CSV文中文乱码问题

  csv文件可以使用excel打开并进行一些操作了,同时我们用php导入csv文件是非常的简单了,所以我们通常会使用php来导出csv了,但有时会碰到在使用Excel打开csv时出现乱码问题了,下面我们就来看解决办法. 乱码情况 写了一段导出 CSV 文件的代码,可以正常输出 使用 CSV 和 TXT 程序打开文件是正常的,但是使用 Excel 打开文件就出现了中文乱码的问题(这就奇怪了, 为什么在 Excel 中会乱码呢?) 通过查看编码发现,导出的 CSV 文件是 UTF-8 无BOM编码

详解PHP导入导出CSV文件_php实例

我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. 复制代码 代码如下: CREATE TABLE `student` (       `id` int(11) NOT NULL auto_increment,       `name` varchar(50) NOT NULL,       `sex` varchar(10) NOT NULL,       `age` smallint(3) NO

thinkPHP导出csv文件及用表格输出excel的方法_php实例

本文实例讲述了thinkPHP导出csv文件及用表格输出excel的方法.分享给大家供大家参考,具体如下: 1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this->display(),最后细心看到think_page_trace这样的字样,恍然大悟,是页面的跟踪日志,这个默认是会输出来的.最后在方法后面加了一个exit结束就好了,下面是代码: 1.I

php导出csv文件,可导出前导0实例代码_php实例

实例一:可导出前导0 //导出csv格式文件 $data数据 $title_arr标题 $file_name文件名 function exportCsv($data,$title_arr,$file_name=''){ ini_set("max_execution_time", "3600"); $csv_data = ''; /** 标题 */ $nums = count($title_arr); for ($i = 0; $i < $nums - 1; +

Mysql 导入导出csv 中文乱码问题的解决方法_Mysql

导入csv: 复制代码 代码如下: load data infile '/test.csv' into table table_name fields terminated by ','  optionally enclosed by '"' escaped by '"' lines terminated by '\r\n' ignore 1 lines; 导csv: 复制代码 代码如下: SELECT * INTO OUTFILE '/test.csv'  FIELDS TERMIN

php导出csv格式数据并将数字转换成文本的思路以及代码分享_php实例

php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."\n"; 然后对需要保存csv的数组进行foreach循环,例如 复制代码 代码如下:               if (!empty($lists)){                  foreach($lists as $key => $value){         

【java】opencsv导出csv之后的数字格式问题解决

问题:某列其实你用记事本打开还是0001, 但是用excel打开是1,而且长数字比如身份证之类的,会变成十六位科学计算法,搞得很难看,而且csv的字符串左对齐,数字右对齐对于某些领导来说是不被看好的,所以如下文字解决此状况.opencsv导出csv之后的数字0消失的格式问题解决. 解决办法有两种:    1.在生成csv的时候,在数字的前面或后面加上"\t"制表符,再用excel打开问题解决!如 "1234567890"      2.在生成csv的时候,在数字的前