Api流式导出大数据

news/2025/3/14 18:28:07/文章来源:https://www.cnblogs.com/tujia/p/18575944

API流式导出大数据

<?phpnamespace App\Admin\Exports;use App\Admin\Services\Statistics\ExaminationRecordsDataService;
use App\Enums\ExaminationStatus;
use Generator;
use Maatwebsite\Excel\Concerns\FromGenerator;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;class ExaminationRecordExport implements FromGenerator, WithHeadings, WithStrictNullComparison
{private array $search;public function __construct(array $search){$this->search = $search;}/*** @return Generator*/public function generator(): Generator{$offset = 0;$chunkSize = 1000;$service = new ExaminationRecordsDataService();$this->search['sort'] = 'examination_records.id';$query = $service->getExaminationRecordsQuery($this->search)->limit($chunkSize);while (true) {$results = $query->clone()->offset($offset)->get();if ($results->isEmpty()) {break;}foreach($results as $item) {yield ['user_name' => $item->user_name,'group_name' => $item->group_name,'title' => $item->title,'course_serial_number' => $item->course_serial_number,'name' => $item->name,'serial_number' =>$item->serial_number,'examination_status' => ExaminationStatus::from($item->examination_status)->label(),'exam_nums' => $item->exam_nums,'total_score' => $item->total_score,'passing_score' => $item->passing_score,'score' => $item->score,'test_start_time' => $item->test_start_time->format('Y-m-d H:i:s'),'test_end_time' => $item->test_end_time->format('Y-m-d H:i:s'),'total_test_duration' => $item->total_test_duration,'test_duration' => floor($item->test_duration / 60 * 100) / 100, // 分钟];}$offset += $chunkSize;}}public function headings(): array{return ['user_name' => '姓名','group_name' => '所屬組織','title' => '所屬課程名稱','course_serial_number' => '所屬課程編號','name' => '考試名稱','serial_number' => '考試編號','examination_status' => '考試狀態','exam_nums' => '考試次數','total_score' => '總分','passing_score' => '通過分數','score' => '考試最高分','test_start_time' => '最高分考試的開始時間','test_end_time' => '最高分考試的結束時間','total_test_duration' => '考試規定時長(分鐘)','test_duration' => '最高分考試的進行時長(分鐘)',];}
}
<?phpnamespace App\Admin\Controllers;use App\Admin\Exports\ExaminationRecordExport;
use App\Admin\Requests\Examination\GetExaminationRecordsListRequest;
use App\Admin\Resources\ExaminationRecord\ExaminationRecordCollection;
use App\Admin\Services\Statistics\ExaminationRecordsDataService;
use App\Traits\SearchStaffGroupTrait;
use App\Traits\SearchTrait;class ExaminationController extends BaseController
{use SearchTrait, SearchStaffGroupTrait;public function getExaminationRecordsList(GetExaminationRecordsListRequest $request){$search = $request->validated();$examinationRecords = (new ExaminationRecordsDataService())->getExaminationRecordsPage($search);return new ExaminationRecordCollection($examinationRecords);}public function export(GetExaminationRecordsListRequest $request){set_time_limit(0);ini_set('memory_limit', '512M');$search = $request->validated();$export = new ExaminationRecordExport($search);header("Content-Type: application/force-download");header("Content-Type: application/octet-stream");header("Content-Type: application/download");header('Content-Disposition: attachment; filename=學員考試記錄.csv');header('Content-Type: text/csv; charset=gb18030');header("Content-Transfer-Encoding: binary");header("Pragma: no-cache");echo mb_convert_encoding(implode(',', array_values($export->headings())), 'gb18030') . "\n";foreach ($export->generator() as $item) {echo mb_convert_encoding(implode(',', array_values($item)), 'gb18030') . "\n";}}
}
const fileUrl = 'https://apitest-new-lms.wiltechs.com/api/admin/exampapers/questions/template?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vYXBpdGVzdC1uZXctbG1zLndpbHRlY2hzLmNvbS9hcGkvYWRtaW4vYXV0aC9sb2dpbiIsImlhdCI6MTcwODQ3NzgyNiwiZXhwIjoxNzA4NTY0MjI2LCJuYmYiOjE3MDg0Nzc4MjYsImp0aSI6IlpuY0VqbWFVbUxnZ01FdVYiLCJzdWIiOiIxOEZENjAzQi03MjcwLTQyMkYtOTZDOS03M0U5QzQ0ODUyMzIiLCJwcnYiOiI3ZWJiOGEyY2MxZDk1YjYyYzk1OTRhMjJjOWNlYzIyZjM4ZGI1ZDMxIn0.D6Ie6QzG0Zm7Yw7nr1sOlaHon7noSY-2gyqpUfNXHfE';const a = document.createElement('a');
const event = new MouseEvent('click');
a.href = fileUrl;
// a.download = fileName;
a.dispatchEvent(event);

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

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

相关文章

无监督模板辅助点云形状对应网络

无监督模板辅助点云形状对应网络无监督点云形状对应旨在建立源点云和目标点云之间的逐点对应关系。现有方法通过计算点云之间的逐点特征相似度直接获得对应关系。然而,非刚性物体具有很强的变形能力和不寻常的形状,因此直接在具有非常规形状的点云之间建立对应关系是一个长期…

国产系统(麒麟V10、uos)使用pageoffice在线编辑office文件

本文描述了PageOffice产品在(VUE+Springboot)前后端分离的项目中如何集成调用。 一、环境 前端:vue2 后端:springboot2、jdk1.8 如果是springboot3,jdk17及以上版本,用这个依赖: <dependency> <groupId>com.zhuozhengsoft</groupId> <arti…

产品经理如何用项目管理技能提升交付质量与效率?

作为产品经理,除了要具备产品设计和创新的能力,还需要掌握项目管理的技巧,因为产品的成功不仅仅取决于设计和开发,项目管理的精细化操作更是不可忽视的一环。项目管理的核心目标是确保项目按时、按质、按量完成,最终能够顺利交付客户。而作为产品经理,我们常常承担着项目…

idea源码下载问题: Cannot download sources Sources not found for:xxx

转载: 原文地址 问题出现的原因是我新建项目后没有手动设置仓库地址,导致用命令mvn dependency:resolve -Dclassifier=sources下载的源码全部自动的下载到默认仓库:C:\Users\xxx\.m2\repository而idea选择源文件时跳出的文件选择框还是我自定义的仓库 所以找不到源码文件,其…

@Url.Content

@Url.Content 是ASP.NET MVC中的一个HTML帮助器,用于生成相对于应用程序根目录的URL。这个帮助器特别有用当你需要引用静态内容,如图片、CSS文件、JavaScript文件等,这些文件通常放在Content文件夹中。 使用@Url.Content可以确保生成的URL是正确的,无论应用程序的基路径是什…

Linux安装RabbitMQ详细教程(最详细的图文教程)

一、环境准备1、RabbitMQ版本 和 Erlang 版本兼容性关系 https://www.rabbitmq.com/which-erlang.html 2、ErLang安装教程 https://www.cnblogs.com/haoliyou/p/17666817.html 3、RabbitMQ的安装依赖于erlang所以先安装4、RabbitMQ CentOS 参考安装步骤 https://www.rabbitmq.c…

考研打卡(30)

开局(30) 开始时间 2024-11-29 08:23:23 结束时间 2024-11-29 09:21:22今早醒来,打了十几个喷嚏,蹲了一分钟才发现是女厕所(还好没人)数据结构 有一个有序表R[1...13]={1,3,9,12,32,41,45,62,75,77,82,95,100}, 当用二分查找法查找值为82的节点时,经过____…

连续分配管理方式

连续分配管理方式 ‍ ​​ 补充: 非连续分配管理方式:基本分页存储管理 基本分段存储管理 段页式存储管理一、前言 对于内存来说:内部碎片:已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间 外部碎片:还没有被分配出去(不属于任何进程),但由于太小了无…

覆盖与交换

覆盖与交换 ‍ ​​ ‍一、覆盖技术 (一)思想 将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。 (二)实现 将内存分为一个“固定区”和若干个“覆盖区”。 需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束) 不常用的段放…

Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制

一、前言 之前做的监控系统,已经实现了在windows上硬解码比如dxva2和d3d11va,后续又增加了linux上的硬解vdpau的支持,这几种方式都是跨系统的硬解实现方案,也是就是如果都是windows系统,无论X86还是ARM都通用,在系统层面屏蔽了实现细节,按照规范来写就行,这种方式叫跨硬…

20222313 2024-2025-1 《网络与系统攻防技术》 实验五实验报告

1. 实验内容 1.1 实验要求 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取相关信息。 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置。 (3)使用nmap开源软件对靶机环境进行扫描,回答以下问题并…

多协议兼容:开启跨网文件传输的新纪元!

金融、医疗、政府单位、跨国公司等企业内部往往存在多个隔离的网络环境,如内网、外网、测试网等。随着数字化办公的深入,内网与内网、内网与外网间的文件交换需求频繁,传统的文件传输方式已无法满足安全、合规的文件交换需求。1、跨国公司在不同地区运营时,需要安全、高效地…