fastadmin-PHP-导出少量数据PhpOffice以及百万级别数据csv压缩

news/2024/11/19 12:10:55/文章来源:https://www.cnblogs.com/wt645631686/p/18554584

在进行数据导出的时候,少量的数据可以使用phpexcel,但大量的数据用phpexcel就很消耗资源了。

在使用fastadmin做数据导出的时候,相关的代码请参考:https://blog.csdn.net/bingyu709/article/details/141949034

我自己这边因为数据量会很大,所以代码层做了一个数量的划分,少于50000走phpexcel导出,大于50000走csv,并且打包zip。

并且我的逻辑是导出成功后把文件防止项目指定目录下,并没有做一个直接下来,如果想直接从浏览器下载请自己网上找其他代码参考,我所参考的帖子是直接下载的,大家可以试试看。

public function export() {if ($this->request->isPost()) {$filter             = $this->request->request("filter", '');$filter_arr         = (array)json_decode($filter, true);$ids                = $this->request->request('ids','');$scene_id                   = CService::MANAGE_ALL_CUSTOMER;if (!empty($filter_arr) && isset($filter_arr['scene_id']))  {$scene_id       = intval($filter_arr['scene_id']);}$scene_where        = $this->getFilterAllSceneWhere($scene_id);list($where, $sort, $order, $offset, $limit) = $this->buildAllParams();if (!empty($ids) && $ids != '' && $ids != 'all') {$ids_arr        = explode(',',$ids);$where['id']    = ['in', $ids_arr];}$where              = array_merge($scene_where,$where);$count              = CModel::model()->where($where)->count();if ($count > 0) {if ($count > 50000) {set_time_limit(0);ini_set('memory_limit', '128M');$xlsTitle = [   '字段1', '字段2', '字段3'];// buffer计数器$cnt = 0;$fileName           = '客户导出'.date('YmdHis').rand(10000000,88888888);//文件名称$pro_path           = ExportService::EXPORT_CUSTOMER_FILE_PATH; // 项目目录$fileName           = $pro_path . $fileName;$zip_file_name      = $fileName.'.zip';// 输出Excel文件头,可把user.csv换成你要的文件名header('Content-Type: application/vnd.ms-excel;charset=utf-8');header('Content-Disposition: attachment;filename="' . $zip_file_name . '"');header('Cache-Control: max-age=0');$fileNameArr = [];$every_step_limit       = 10000;$loop_number_count      = intval(ceil($count / $every_step_limit));for ($i = 0; $i < $loop_number_count; $i ++) {$fp = fopen($fileName . '_' . ($i+1) . '.csv', 'w'); //生成临时文件fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));/*防止乱码  */// chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限$fileNameArr[] = $fileName . '_' . ($i+1) . '.csv'; // 将数据通过fputcsv写到文件句柄
                        fputcsv($fp, $xlsTitle);/******************** 调整位置开始 ***************************/$limit          = $i * $every_step_limit;$limit_list     = ExportService::service()->getExportList($where, $limit, $every_step_limit);$list           = ExportService::service()->formatExportData($limit_list, $this->auth_global_search_organise_id);if (!empty($list)) {foreach ($list as $item) {$cnt++;if ($limit == $cnt) {// 刷新一下输出buffer,防止由于数据过多造成问题
                                    ob_flush();flush();$cnt = 0;}fputcsv($fp, $item);}unset($list);}fclose($fp); // 每生成一个文件关闭
                    }try {// 进行多个文件压缩$zip = new \ZipArchive();$zip->open($zip_file_name, $zip::CREATE); // 打开压缩包foreach ($fileNameArr as $file) {$zip->addFile($file, basename($file)); // 向压缩包中添加文件
                        }$zip->close();  // 关闭压缩包foreach ($fileNameArr as $file) {unlink($file); // 删除csv临时文件
                        }if (file_exists($zip_file_name)) {$this->success('操作成功');} else {$this->error('操作失败');}} catch (ValidateException|PDOException|Exception $e) {$this->error('操作失败');}} else {set_time_limit(0);$spreadsheet    = new Spreadsheet();$sheet          = $spreadsheet->getActiveSheet();$sheet->getStyle('A:S')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER) //设置垂直居中->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER) //设置水平居中->setWrapText(true); //设置自动换行
$titleStyleArray     = ['font'      => ['name'  => 'SimHei', // 中文字体,"黑体"的类似字体'bold'  => true,'size'  => 12,]];$sheet->getStyle('A1:Z1')->applyFromArray($titleStyleArray);$lineStyleArray     = ['font'      => ['name'  => 'SimHei', // 中文字体,"黑体"的类似字体
                        ]];//设置表头$sheet->setCellValue('A1', '字段1');$sheet->setCellValue('B1', '字段2');$sheet->setCellValue('C1', '字段3');
            .......
$sheet->getColumnDimension('A')->setWidth(15);$sheet->getColumnDimension('B')->setWidth(15);$sheet->getColumnDimension('C')->setWidth(15);
            .......
//$sheet->getDefaultRowDimension()->setRowHeight(60); //设置行高 $res_list = ExportService::service()->getExportCustomerList($where);$list = ExportService::service()->formatExportCustomerData($res_list, $this->auth_global_search_organise_id);if (!empty($list)) {//输出表格foreach($list as $keys => $value) {$keys = $keys + 2;$sheet->setCellValue('A'.$keys,$value['field1'] ?? '')->getStyle('A')->applyFromArray($lineStyleArray);$sheet->setCellValue('B'.$keys,$value['field2'] ?? '')->getStyle('B')->applyFromArray($lineStyleArray);$sheet->setCellValue('C'.$keys,$value['field3'] ?? '')->getStyle('C')->applyFromArray($lineStyleArray);
                 .........
}}// 保存Excel文件到服务器的指定路径$pro_path = ExportService::EXPORT_CUSTOMER_FILE_PATH; // 项目目录$file_name = '导出'.date('YmdHis').rand(10000000,88888888).'.xlsx';$file_path = $pro_path . $file_name;// if (!file_exists($file_path)) { // fopen($file_path, 'w'); // }try {$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');$writer->save($file_path);if (file_exists($file_path)) {$this->success('操作成功');} else {$this->error('操作失败');}} catch (ValidateException|PDOException|Exception $e) {$this->error('操作失败');}}}}}

 

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

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

相关文章

【算法】KMP 与 Z 函数

1. KMP 1.1 算法简介 可以做到线性匹配的快速匹配字符串的算法,并可以维护字符串最长公共前后缀,扩展出计算字符串周期。 在 OI 界 KMP 算法是字符串板块中很经典的算法,可以扩展出很多巧妙的解题技巧。 1.2 算法流程 1.2.1 字符串匹配 考虑 \(O(n^2)\) 暴力的匹配,瓶颈在于…

apifox使用小记

1.copy as cURL(cmd)之后在apifox里直接import cURL 2.调用时发生301错误 通常情况下是因为有session校验存在(用户校验)。解决方案: F12里将cookie里的session取到,在apifox里全局配置 这里踩了一个坑 第一次我是import了一个get请求,发送后发生301,所以我去设置了co…

毕业实习总结报告

毕业实习总结报告这既是毕业实习要求的总结报告,也是我对AutoSAR的一点理解,更是个人对未来生活的一点思考。我不希望把这份报告草草水过,而是希望把现在的感受记录下来,给以后的自己看一看,好记性不如记下来。涉及到工作细节和隐私的部分不在此展示了。时间像一头野驴呀,…

IDEA 2024 最新激活码,激活至2099(附有效idea激活码+激活工具)

IDEA 2024最新激活码,激活至2099(附有效idea激活码+激活工具)若提示We could not validate your license ff83b7bd51f5460ca43aabd7a96863a0.信息,idea激活时提示激活码失效解决方法: IDEA 2024 解决 We could not validate your license ff83b7bd51f5460ca43aabd7a96863a…

大学物理上册

质点作曲线运动时,质点在某一点的速度方向就是沿该点曲线的切线方向。

KingbaseES V8R6备份恢复案例之---sys_backup.sh init错误

KingbaseES 、sys_rman案例说明: KingbaseES V8R6数据库单实例环境,执行sys_backup.sh init时,出现“ repo_ip [127.0.0.1] must be located in local”错误,初始化失败。 适用版本:KingbaseES V8R6 一、问题现象 如下所示,执行sys_backup.sh init时出现以下故障:二、问…

鱼厂实习,光速转正了!

从最初那一份懵懂,到如今独立承担项目,回想这一路在鱼厂的成长,每一步都像是在重塑一个新的自己。今天要分享的这篇文章,比较特殊,是我们团队一位同事写的。主要分享了他从 0 开始学编程,再到加入鱼厂光速转正的故事。长达 6000 多字,诉说了自己四年多的经历,满满的真情…

深育大讲堂 | 洞见容器存储技术原理和市场应用趋势

深育大讲堂 | 洞见容器存储技术原理和市场应用趋势 4月12日,【深育大讲堂】系列直播活动第一讲“从容器存储讲起”圆满结束。深信服产教中心资深讲师丁运管、深信服四川省云业务总监薛悟团分别就多场景下的容器存储技术以及容器技术的应用与最佳实践进行深入剖析;并聚焦前沿…

apipost学习

开发团队的痛点: 1. 任何一个团队都是由前端、后端、测试三个TEAM组成的。 2. 产品经理确定需求和过评审后,前后端开发人员一起开会研讨定接口。并先由一个开发人员负责用Swagger定义API文档; 3. 后端会参照API 文档开发接口,并进行调试,用Postman里再跑一遍。 4. 接口…

你的团队如何在项目管理中实现智能化协作?

随着科技的快速发展,现代社会的各个领域都进入了智能化与高效化的时代。在这个背景下,项目管理软件作为提升工作效率、协作能力和组织规范性的重要工具,逐渐融入了更多跨界元素。从与人工智能(AI)的结合,到与创业者的合作,再到时间管理的深度挖掘,项目管理软件已经不再…

HyperWorks一维单元创建与模型连接管理

在HyperWorks的有限元分析中,一维单元是非常重要的概念。我们可以使用一维单元连接节点,或将不匹配的网格部件进行连接,进行载荷施加,以及用于建立焊接,螺栓,铆钉等等各类工程中经常运用的模型连接方式。 一维单元的类型是非常多的。有简单的刚性连接单元,有包含复杂截面…

JAVA反序列化学习-CommonsCollections3(基于ysoserial)

环境准备 JDK1.7(7u80)、commons-collections(3.x 4.x均可这里使用3.2版本) JDK:https://repo.huaweicloud.com/java/jdk/7u80-b15/jdk-7u80-windows-x64.exe <dependency><groupId>commons-collections</groupId><artifactId>commons-collections<…