PHP如何切割excel大文件,使用 PHP_XLSXWriter 代替 PHPExcel 10W+ 数据秒级导出

news/2024/7/21 5:16:03 标签: excel, php

PHP如何切割excel大文件

利用phpspreadsheet可以轻松的解析excel文件,但是phpspreadsheet的内存消耗也是比较大的,我试过解析将近5M的纯文字excel内存使用量就会超过php默认的最大内存128M。

当然这可以用调节内存大小的方法来解决,但是在并发量大的时候就比较危险了。

所以今天介绍下一种方法,利用phpspreadsheet对excel文件进行切割,这是个拿时间换空间的方法所以一般对时效性要求低的需求可以使用。

方法:

先放个phpspreadsheet官网提供的一个功能readCell,我们就可以利用这个功能来进行切割。

首先对excel文件进行预读,主要是获取所有的工作表以及工作表下面的数据行数,这个阶段readCell方法一直返回的都是false,我们只需要记录readCell进来的工作表及数据行数。

然后就是对获取到的记录进行分析,确定每部分数据需要装多少行原始excel的数据,需要注意的是为了避免内容混淆,不要讲两个工作表的内容切到一起。

最后就是循环分析的数据和再次利用readCell获取每部分数据,注意每次读取文件后都要利用disconnectWorksheets方法清理phpspreadsheet的内存。

经过我自己的测试发现,利用该方法解析5M的excel文件,平均只需要21M的内存就可以搞定!

代码:

<?php    
namespace CutExcel;    
require_once 'PhpSpreadsheet/autoload.php';    
/**    
 * 预读过滤类    
 * @author wangyelou     
 * @date 2018-07-30    
 */   
class MyAheadreadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter    

{    
    public $record = array();    
    private $lastRow = '';    
    public function readCell($column, $row, $worksheetName = '')     

    {    
        if (isset($this->record[$worksheetName]) ) {    
            if ($this->lastRow != $row) {    
                $this->record[$worksheetName] ++;           
                $this->lastRow = $row;    
            }     

        } else {    
            $this->record[$worksheetName] = 1;           
            $this->lastRow = $row;    
        }    
        return false;    
    }    
}    

/**    
 * 解析过滤类    
 * @author wangyelou     
 * @date 2018-07-30    
 */   
class MyreadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter    
{    
    public $startRow;    
    public $endRow;    
    public $worksheetName;    
    public function readCell($column, $row, $worksheetName = '')     
    {    
        if ($worksheetName == $this->worksheetName && $row >= ($this->startRow+1) && $row <= ($this->endRow+1)) {    
            return true;    
        }    
        return false;    
    }    
}    

/**    
 * 切割类    
 * @author wangyelou     
 * @date 2018-07-30    
 */   
class excelCut    
{    
    public $

http://www.niftyadmin.cn/n/5057671.html

相关文章

v-for中的key

在Vue中&#xff0c;当使用v-for指令循环渲染元素时&#xff0c;添加:key是一个推荐做法&#xff0c;尤其是在循环的元素可能会被重新排序、添加或删除的情况下。 :key的作用是为每个循环的元素提供一个唯一的标识符&#xff0c;以便Vue能够跟踪和管理这些元素的状态。Vue使用…

《Python趣味工具》——ppt的操作(2)

在上次&#xff0c;我们对PPT进行了简单的处理&#xff1b;本次&#xff0c;我们要将PPT中的文本内容写入到 Word 文档中并添加标题&#xff0c;让 Word 文档看上去结构清晰&#xff0c;方便使用。 文章目录 一、安装docx模块&#xff1a;二、从PPT中转移文字&#xff1a;1. 创…

《C++ Primer》第4章 表达式(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 4.1 基础&#xff08;P120&#xff09; 表达式由一个或多个运算对象组成&#xff0c;对表达式求值将得到一个结果。字面量和变量是最简单的表达式。 4.1.1 基本概念&#xff08;P120&#xff09; C 定义了…

什么是跨站请求伪造(CSRF)攻击?如何防止它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是跨站请求伪造&#xff08;CSRF&#xff09;攻击&#xff1f;⭐ 如何防止CSRF攻击&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦…

Matlab坐标轴标签中文设置宋体

对y坐标输出中文宋体 新罗马字符 x[1,2,3,4,5,6,7]; plot(x) ylabel(\fontname{宋体}\fontsize{20}长度\fontname{Times New Roman}\fontsize{10} (μm))可以灵活设置字体和大小,其图片如下图所示 也可以对全图的文字设置同一个字体 set(gca,FontSize,9,Fontname, Times New…

建造者模式 创建型模式之三

想要搞清楚建造者模式&#xff0c;首先先要了解建造者模式种四个角色的定位 1.Product&#xff1a;表示被构造的复杂对象&#xff0c;就是我们要建造的东西&#xff0c;比如我们要做一个手机&#xff0c;手机就是product。 2.Builder&#xff1a;建造者&#xff0c;这里需要着…

向量数据库风起时,闭源「墨奇AI数据库」想成为第三种存在

AI大模型时代下,图片、视频、自然语言等多模态的非结构化数据量陡增,而大模型支持的token数有限,虽然可以在RLHF的配合下具备一定程度的“短期记忆”,但正是因为“长期记忆”的缺失,导致大模型经常会出现“一本正经地胡说八道”的情况。 区别于用来处理结构化数据的传统数…

What Is A DNS Amplification DDoS Attack?

什么是 DNS 放大攻击&#xff1f; 域名系统 &#xff08;DNS&#xff09; 是用于在网站的机器可读地址&#xff08;例如 191.168.0.1&#xff1a;80&#xff09;和人类可读名称&#xff08;例如 radware.com&#xff09;之间进行解析的目录在 DNS 放大攻击中&#xff0c;攻击者…