php 导出CSV抽象类

2023-05-16

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);
    }

} // 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();

?>

源码下载地址:点击查看


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Yii 2.0 AJAX 请求的 CSRF 验证

    我有一个ajax触发从我的数据库中删除条目的函数 我需要去做CSRF验证相同 我怎样才能做到这一点 我正在发送CSRF cookie连同我的帖子请求 但是Yii 2 0不验证它 并且通过 ajax 传递的任何输入都会到达服务器 我该怎么做C
  • 帮助我将以十六进制表示的长值转换回日期/时间

    我有一个日期值 据说它是 8 个字节 一个 long 又名 int64 值 并转换为十六进制 60f347d15798c901 我如何使用 PHP 将这个和类似的值转换为时间 日期 将其转换为十进制给我 96 243 71 209 87 1
  • PHP json_encode json_decode UTF-8

    如何将包含国际字符的 json 编码字符串保存到数据库 然后在浏览器中解析解码后的字符串
  • 致命错误:找不到类“App\PDO”

    当我尝试使用命名空间时出现此错误 I have namespace App 顶部 班级看起来像 class database function construct try this gt db new PDO lt here the err
  • PHP - 将文件系统路径转换为 ​​URL

    我经常发现项目中的文件需要从文件系统和用户浏览器访问 一个例子是上传照片 我需要访问文件系统上的文件 以便可以使用 GD 来更改图像或移动它们 但我的用户还需要能够从类似以下的 URL 访问文件example com uploads myp
  • 如果用户登录,则更改引导程序中的导航栏

    我有一个标准菜单 包括 登录 和 创建用户 的选项 我想要的是 当您创建用户或登录整个导航栏菜单来更改 例如 我的用户页面 和 注销 时 我该怎么做 div div
  • 是否可以在MySQL UDF中的IF条件中声明游标

    我可以在 if 语句中声明游标吗 如果可能的话我怎样才能做到 因为我刚刚做了这样的光标 CREATE FUNCTION fn test ProductID BIGINT 20 RETURNS DECIMAL 10 2 BEGIN DECLA
  • 如何在 PHPUnit 中跨多个测试模拟测试 Web 服务?

    我正在尝试使用 PHPUnit 测试 Web 服务接口类 基本上 这个类调用肥皂客户端目的 我正在尝试使用 PHPUnit 测试此类getMockFromWsdl这里描述的方法 http www phpunit de manual curr
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 使用 py2neo 从 csv 文件创建 neo4j 图形数据库

    我目前正在攻读博士课程 并且对 Py2neo 很感兴趣 因此我使用它来使用社交图谱进行一些实验 然而我遇到了新手麻烦 抱歉问这些简单的问题 我得到了一个 xml 数据集 其中包含有关期刊出版物的数据 我已将其转换为 csv 表 大约有 70
  • 来自字符串的文件大小

    我如何从 php 中的字符串中获取 文件大小 我将字符串作为 blob 放入 mysql 数据库中 并且需要存储 blob 的大小 我的解决方案是创建一个临时文件并将字符串放入临时文件中 现在我可以从 字符串 中获取文件大小 但这个解决方案
  • after_or_equal 验证在 laravel 5.2 中不起作用

    我想比较 start date 和 end date 并且 end date 应等于或大于 start date 我正在使用 after or equal 验证 return Validator make data start date g
  • ios 无法将图片上传到服务器

    您好 我正在尝试将图像从我的 IOS 设备上传到服务器 这是我上传图像的代码 IBAction btnUpload id sender if self imageViewGallery image nil UIAlertView Error
  • PHP 的 USORT 回调函数参数

    这是一个非常深奥的问题 但我真的很好奇 今天是我多年来第一次使用 usort 我对到底发生了什么特别感兴趣 假设我有以下数组 myArray array 1 9 18 12 56 我可以用 usort 对此进行排序 usort myArra
  • WooCommerce:在未登录用户的结帐页面中默认设置国家/地区

    如何将国家 地区设为常规 未注册用户 的默认国家 地区 但如果买家有个人账户并进入该国 他在结帐时不会被拖欠吗 我尝试过使用WooCommerce 在结帐页面中默认设置国家 地区 https stackoverflow com questi
  • GhostScript PDF 合并(丢失可编辑字段)

    我正在使用 GhostScript 将 PDF 合并为一个 PDF 其中一份 PDF 具有我在 Adob e Acrobat Pro 9 中创建的文本框字段 可编辑字段 当我使用 GhostScript 合并这两个 PDF 时 我丢失了文本
  • preg_match_all JS 等效吗?

    Javascript 中是否有与 PHP 的 preg match all 等效的函数 如果没有 将正则表达式的所有匹配项放入数组的最佳方法是什么 我愿意使用任何 JS 库来让它变得更容易 您可以使用match使用全局修饰符 gt gt g
  • Err_Response_Headers_Multiple_Content_Disposition

    我需要导出 2csv单击一个按钮即可打开文件 下面是我生成2的代码csv files using System Data using System Data SqlClient using System Text using System
  • TCPDF 为一个文档中的不同页面设置不同的页眉

    有没有办法使文档中第一页的页眉徽标和第二页的页眉徽标不同 我认为在添加页面之间更改标题数据可能会解决问题 但在我的测试中 添加第一页后设置标题似乎没有效果 other stuff pdf gt setHeaderFont array PDF
  • Php 会话标头已经发送错误[重复]

    这个问题在这里已经有答案了 可能的重复 php 标头已发送错误 https stackoverflow com questions 3319207 php headers already sent error 我已附上我的代码 该代码用于

随机推荐

  • Apache 搭建HTTPS Virtual Host

    Apache 搭建HTTPS Virtual Host 1 创建SSL证书 首先需要安装openssl xff0c linux系统默认已安装 xff0c 如没有则用以下命令安装 xff1a sudo apt get install open
  • MongoDB 主从同步设置

    MongoDB 主从同步设置 关于MongoDB的安装及启动参数说明可以参考我之前转载的 Ubuntu安装MongoDB 与 Mongodb启动命令mongod参数说明 主从设置 Master xff1a 192 168 111 103 P
  • php Timer 页面运行时间监测类

    php Timer 页面运行时间监测类 xff0c 可按不同key监测不同的运行时间 Timer class php lt php Timer class 计算页面运行时间 可按不同key计算不同的运行时间 Date 2014 02 28
  • C 使用异或(xor)加密/解密文件

    C 使用异或 XOR 加密 解密文件 之前写过一篇 php 使用异或 xff08 XOR xff09 加密 解密文件 xff0c 但php执行的速度很慢 xff0c 因此这次使用C重写 xff0c 速度有很大的提高 xor encrypt
  • 使用C创建php扩展

    使用C创建php扩展 优点 xff1a 1 提高运行效率 2 降低php复杂度 xff0c 可以直接调用扩展方法实现功能 3 方便与第三方库交互 缺点 xff1a 1 开发比php复杂 2 可维护性降低 3 开发周期变长 php开发 xff
  • linux 系统监控命令

    linux系统监控有以下命令 xff1a uptime xff1a 显示系统负载情况 mpstat xff1a 显示 CPU 性能 free xff1a 显示内存使用情况 vmstat xff1a 显示虚拟内存使用情况 iostat xff
  • php 构造函数支持不同个数参数的方法

    php 构造函数支持不同个数参数方法 原理 xff1a 在 construct中使用 func num args 获取参数个数 xff0c 再根据参数个数执行不同的调用 参数值使用func get arg 方法获得 demo xff1a l
  • A+B for Polynomials(c++)

    题目描述 xff1a This time you are supposed to find A 43 B where A and B are two polynomials 输入描述 xff1a Each input file contai
  • php soap 使用实例

    SOAP 是基于XML和HTTP通讯协议 xff0c XML各个平台 xff0c 各种语言都支持的一种语言 WSDL 是网络服务描述语言 xff08 Web Services Description Language xff09 xff0c
  • 使用PDO查询mysql避免SQL注入

    使用传统的 mysql connect mysql query方法来连接查询数据库时 xff0c 如果过滤不严紧 xff0c 就有SQL注入风险 虽然可以用mysql real escape string 函数过滤用户提交的值 xff0c
  • linux crontab 实现每秒执行

    linux crontab 命令 xff0c 最小的执行时间是一分钟 如需要在小于一分钟内重复执行 xff0c 可以有两个方法实现 1 使用延时来实现每N秒执行 创建一个php做执行动作 xff0c 非常简单 xff0c 就是把当前时间写入
  • ssh远程执行命令并自动退出

    ssh命令格式如下 xff1a usage ssh 1246AaCfgKkMNnqsTtVvXxYy b bind address c cipher spec D bind address port e escape char F conf
  • shell 监控cpu,memory,load average

    shell 监控cpu xff0c memory xff0c load average xff0c 记录到log xff0c 当负载压力时 xff0c 发电邮通知管理员 原理 xff1a 1 获取cpu xff0c memory xff0c
  • shell date 命令说明

    shell date 命令说明 用法 xff1a date 选项 43 格式 或 xff1a date u utc universal MMDDhhmm CC YY ss 以给定的格式显示当前时间 xff0c 或是设置系统日期 d date
  • shell 生成指定范围随机数与随机字符串

    shell 生成指定范围随机数与随机字符串 1 使用系统的 RANDOM 变量 fdipzone 64 ubuntu echo RANDOM 17617 RANDOM 的范围是 0 32767 如需要生成超过32767的随机数 xff0c
  • php 双向队列类

    xff08 deque xff0c 全名double ended queue xff09 是一种具有队列和栈的性质的数据结构 双向队列中的元素可以从两端弹出 xff0c 其限定插入和删除操作在表的两端进行 在实际使用中 xff0c 还可以有
  • php heredoc 与 nowdoc

    php heredoc 与 nowdoc heredoc 结构 heredoc 句法结构 xff1a lt lt lt 在该运算符之后要提供一个标识符 xff0c 然后换行 接下来是字符串本身 xff0c 最后要用前面定义的标识符作为结束标
  • HTML5 localStorage and sessionStorage

    HTML5 提供两种web存储方法 xff0c localStorage 与 sessionStorage localStorage 与 sessionStorage 区别 localStorage没有过期时间 xff0c 只要不clear
  • AZ_自定义不等高的cell

    自定义不等高的cell 1 给模型增加frame数据 纯代码 让ViewController继承UITableViewController xff0c 移除storyboard中的ViewController xff0c 新建一个UITab
  • php 导出CSV抽象类

    php 导出CSV抽象类 xff0c 根据总记录数与每批次记录数 xff0c 计算总批次 xff0c 循环导出 避免内存不足的问题 ExportCSV class php lt php php Export CSV abstract cla