Laravel5使用box/spout扩展,大文件导出CSV文件

一、背景

早期开发的系统,使用laravel框架,版本V5.4,项目经理导出 3 年的数据,由于数据量较大,浏览器卡死。一次性无法导出,某位程序员告知按月去导出,之后在拼凑,这。。搁谁受的了,我担心投诉,加个班优化下。

二、优化方案

  1. 导出数据的Sql,对应创建索引,提高查询速度
  2. 查询结果集使用 chunk() 方法拆分较小集合
  3. 使用box/spout扩展进行导出

三、box/spout扩展安装

由于服务器 PHP 的版本比较老,5.6,box/spout 版本只能安装 v2.7.3,安装流程:

3.1 安装

composer require box/spout:v2.7.3

3.2 使用导出功能

3.2.1 控制器中引入使用到的方法:

use Box\Spout\Common\Type;
use Box\Spout\Writer\WriterFactory;

3.2.2 主要代码示例:

// 实例化类,传递参数:Type::CSV 代表导出 csv 文件,支持 3 种格式
$writer = WriterFactory::create(Type::CSV);// 浏览器下载方式
// 注意:这里的openToBrowser方法,扩展包源码只传递 1 个 参数,有修改源码,参考四。。
$filename = '文件名称.csv';
$aHeader = ['Content-Description: File Transfer','Content-Disposition: attachment; filename=' . $filename,'Expires: 0','Cache-Control: must-revalidate','Pragma: public',
];
$writer->openToBrowser($filename, $aHeader);// 支持文件存储
// 代码:$writer->openToFile("存储路径"); // addRow,添加单行 - 表头
$title = ['姓名', '年龄'];
$writer->addRow($title);// addRow,添加单行 - 示例内容
$content = ['张大胆', 18];
$writer->addRow($content);// [重要],添加多行内容,使用addRows。查询数据库之后的代码循环拼接内容,示例:
$aDates = [];
$aDates[] = [['李胆大', 20],['王老五', 25],['钱老三', 33],
];
// 假设 - 循环数据库查询结果集,拼多行内容。
foreach ($dbData as $data) $aDatas[] = $data;
}// 添加多行
$writer->addRows($aDatas);
// 导出完毕后,关闭Writer对象:
$writer->close();

四、遇到的问题及修改源码包

本地windows环境导出正常,正式 centos 环境导出没有文件名,只有一个csv后缀文件。
怀疑是header的问题,修改源代码,自定义传递 header

修改源码位置:
vendor\box\spout\src\Spout\Writer\WriterInterface接口,30行,增加了 , $headers = []参数

public function openToBrowser($outputFileName, $headers = []);

vendor\box\spout\src\Spout\Writer\AbstractWriter类,134行,增加了 , $headers = []参数

public function openToBrowser($outputFileName, $headers = []){$this->outputFilePath = $this->globalFunctionsHelper->basename($outputFileName);$this->filePointer = $this->globalFunctionsHelper->fopen('php://output', 'w');$this->throwIfFilePointerIsNotAvailable();// Clear any previous output (otherwise the generated file will be corrupted)// @see https://github.com/box/spout/issues/241$this->globalFunctionsHelper->ob_end_clean();// Set headers$this->globalFunctionsHelper->header('Content-Type: ' . static::$headerContentType);/** When forcing the download of a file over SSL,IE8 and lower browsers fail* if the Cache-Control and Pragma headers are not set.** @see http://support.microsoft.com/KB/323308* @see https://github.com/liuggio/ExcelBundle/issues/45*//** 核心修改代码位置*/foreach ($headers as $header){$this->globalFunctionsHelper->header($header);}$this->openWriter();$this->isWriterOpened = true;return $this;}

五、结果

筛选跨年数据一次性导出,皆大欢喜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpingMVC之拦截器使用详解

拦截器概述 SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 过滤器和拦截器区别 过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过…

千兆以太网硬件设计及链路层 MAC 协议格式

以太网系列文章: (1)千兆以太网硬件设计及链路层 MAC 协议格式 (2)千兆以太网网络层 ARP 协议的原理与 FPGA 实现 (3)CRC校验代码原理 文章目录 前言一、以太网 MAC 层接口介绍1.MII 接口2.GMII…

重建大师提交空三后引擎状态是等待,怎么开启?

答:图片中这是在自由网空三阶段,整个AT都是等待中,可以修改任务目录和监控目录看一下,先设置引擎,再提交空三。

备考11月份PMP考试还来得及吗?

2023年共有4次PMP考试,分别是3月、5月、8月、11月,现在仅剩11月还有一次考试,也是今年可参加的最后一次PMP考试。那么,现在备考11月份PMP考试还来得及吗? 答案是肯定的。现在开始备考11月PMP考试,时间是很…

可变参数JAVA

public class Main {public static void main(String[] args) {//方法形参的个数是可以变化的//格式:属性类型...名字System.out.println(getSum(1,2,3,4,5,6,7,8));}//通过键值对对象来遍历;public static int getSum(int a,int...args){//可变参数;int…

IDEA2023.2.1取消空包隐藏,切换包结构(Compact Middle Packages)

解决2023版idea的包结构 取消勾选即可。 取消勾选Compact Middle Packages选项后,再创建包时,即可自动创建树形结构。 仅供学习使用!

IP地址,子网掩码,默认网关,DNS讲解

IP地址:用来标识网络中一个个主机,IP有唯一性,即每台机器的IP在全世界是唯一的。 子网掩码:用来判断任意两台计算机的ip地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行and运算后&#x…

黑马头条 热点文章实时计算、kafkaStream

热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算kafkaStream概述kafkaStream入门案例Springboot集成kafkaStream 实时计算 用户行为发送消息kafkaStream聚合处理消息更新文章行为数量替换热点文章数据 2 实时流式计算 2…

医学访问学者申请四点规划建议

医学领域一直以来都是人类社会的重要组成部分,而作为一名有志于成为一名医学领域的访问学者,您需要明确自己的目标并做好充分准备。知识人网小编将为您提供四点规划建议,以帮助您成功申请医学访问学者的机会。 第一点:明确研究方向…

OOM分析实战

OOM分析&实战 OOM分析&实战引言:一、JVM内存结构二、JVM OOM错误情况三、实践案例一案例二案例三 四、总结五、分析工具推荐六、参考文献 OOM分析&实战 引言: 在Java开发中,随着应用程序变得越来越复杂,内存管理问题…

PaddleSeg学习3——使用PP-LiteSeg模型对道路进行分割

使用PP-LiteSeg模型对道路进行分割 1 准备环境2 样本3 准备config文件4 模型训练5 模型预测5.1 python预测5.2 C++预测5.3 预测结果展示1 准备环境 参考上一篇:Windows PaddleSeg c++部署 2 样本 车道线分割实战的智能车数据集 #标签 背景:0, 0.05 单实线-黄

Debian11之稳定版本Jenkins安装

系统要求 机器要求 256 MB 内存,建议大于 512 MB 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)软件要求 Java 8 ( JRE 或者 JDK 都可以) Docker (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载 Maven 用于构…

【循环冗余码检错示例】

接收方怎么看有错没有 余数为0就是无错!

使用Jquery实现轮播图

虽然轮播图已经有很多第三方库&#xff0c;但是手动实现一个还是能够对javascript有一个更深的理解。 今天就讲一讲如何使用Jquery实现轮播图 首先html结构如下&#xff1a; <div class"scroll"> // 结合下面的css样式可以知道&#xff1a; 下面是五张轮播图…

低代码框架开发平台厂家:做好产品,实现流程化办公!

在新的发展时代&#xff0c;低代码技术平台拥有诸多优势特点&#xff0c;成为广大企业实现降本、增效办公效率的得力助手。什么样的低代码框架开发平台厂家值得信任与青睐&#xff1f;都有哪些主要产品&#xff1f;为了帮助大家了解这一讯息&#xff0c;一起来了解流辰信息低代…

记录一次使用网云穿实现内网穿透操作

记录一次使用网云穿实现内网穿透操作 摘要 这段时间也很少写博客了,一方面工作表较忙,一方面觉得有些东西在百度上都能找到,甚至比我自己记录的详细,有些笔记也就没打, 这次记录笔记主要是觉得这个 网云穿 很好用,分享给大家. 1 什么是内网穿透? 内网穿透也叫内网映射&#xf…

【Android知识笔记】进程通信(一)

一、Android Framework 用到了哪些 IPC 方式 Linux 的 IPC 方式有: 管道Socket共享内存信号信号量消息队列管道通信 管道是基于pipefs文件系统实现的,也就是多个进程通过对同一个文件进行读写来实现进程间通信。半双工,单向的,通过 pipe(fds) 系统函数调用可得到一对文件描…

离散高斯抽样(Discrete Gaussian Sampling)

离散高斯抽样 离散高斯抽样&#xff08;Discrete Gaussian Sampling&#xff09;是一种常见于密码学和数学领域的随机采样方法。它通常用于构建基于格&#xff08;lattice&#xff09;的密码学方案&#xff0c;如基于格的加密和数字签名。Discrete Gaussian Sampling 的主要目…

20个非常有用的单行Python代码片段

1. 写在前面 继上篇&#xff0c;继续在本文分享 20 个 Python 单行代码&#xff0c;可以在 30 秒或更短时间内轻松学会。这些单行代码不仅可以提高效率&#xff0c;同时使代码看起来更整洁、更易读。&#xff1a;&#xff09; 个人博客&#xff1a; https://jianpengzhang.git…

MFC|选择获取文件路径

参考&#xff1a;mfc按钮选择文件或者文件夹&#xff08;https://blog.csdn.net/qq_39433050/article/details/130261518&#xff09; 点击按钮槽函数&#xff0c;选择文件 void CMFCStartGrabDlg::OnBnClickedSelectfile() {// TODO: Add your control notification handler…