如何将Processmaker Collection记录导出为可下载Excel文件
Processmaker Collection记录导出Excel下载实现方案
在你已经完成数据采集、拿到结构化结果数组的前提下,有3种可直接落地的实现方式,优先推荐第一种,兼容性最高、无需额外安装依赖。
方案1:脚本内直接生成Excel流触发下载(推荐)
Processmaker 4.x及以上版本核心预装了PhpSpreadsheet库,无需额外安装依赖,直接在你现有采集脚本末尾追加表格生成、下载响应逻辑即可。
- 核心实现逻辑:初始化表格实例→写入表头→遍历你的结果数组填充行→设置下载响应头→输出文件流终止后续程序执行
- 可直接复用的代码示例(PHP运行时脚本):
<?php // 此处为你之前已经采集完成的结果数组,可直接替换成你自己的变量 $collectedRecords = [ ['record_id' => 1, 'applicant' => '张三', 'apply_time' => '2024-03-01', 'total' => 1299], ['record_id' => 2, 'applicant' => '李四', 'apply_time' => '2024-03-02', 'total' => 2588] ]; // 引入内置表格操作类 use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 大数量导出请提前放开内存限制,单批1万条以内可省略 ini_set('memory_limit', '512M'); $spreadsheet = new Spreadsheet(); $activeSheet = $spreadsheet->getActiveSheet(); // 写入表头,可根据你的数组字段自定义 $tableHeaders = ['记录ID', '申请人', '申请时间', '申请金额']; $colFlag = 'A'; foreach ($tableHeaders as $headerText) { $activeSheet->setCellValue($colFlag . '1', $headerText); $colFlag++; } // 逐行写入采集到的记录,从第2行开始(第1行是表头) $rowFlag = 2; foreach ($collectedRecords as $singleRecord) { $activeSheet->setCellValue('A' . $rowFlag, $singleRecord['record_id']); $activeSheet->setCellValue('B' . $rowFlag, $singleRecord['applicant']); $activeSheet->setCellValue('C' . $rowFlag, $singleRecord['apply_time']); $activeSheet->setCellValue('D' . $rowFlag, $singleRecord['total']); $rowFlag++; } // 设置下载响应头 $exportFileName = 'Collection记录导出_' . date('YmdHis') . '.xlsx'; header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="' . $exportFileName . '"'); header('Cache-Control: max-age=0'); // 清空输出缓冲区,避免平台自带输出内容导致文件损坏 if (ob_get_contents()) ob_end_clean(); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); exit;
- 配置注意事项:
- 如果脚本是绑定在前端页面自定义按钮上触发,按钮的响应类型必须选择文件下载,不要选普通JSON返回,否则会把文件流当文本渲染
- 如果你的结果数组字段是动态变化的,可以直接取数组第一行的键名自动生成表头,无需手动写死列映射
- 单批导出超过1万条记录时,必须加上内存限制配置,否则容易触发内存溢出报错
方案2:生成临时文件返回下载链接(适合超大量导出)
如果单次要导出的记录超过5万条,实时流输出容易触发脚本超时,可采用临时文件方案:
- 脚本生成Excel后不直接输出流,而是保存到平台
public/storage/export/目录下(提前给该目录配置写入权限) - 生成带时效校验的访问路径返回给前端,用户点击路径即可下载
- 配置服务器定时任务,自动清理24小时前生成的导出文件,避免占用磁盘空间
方案3:对接平台内置导出组件(零代码补充)
如果你用的是Processmaker标准Collection功能,不需要自己写全量导出逻辑:
- 现有采集脚本只需要返回过滤后的目标记录ID集合
- 前端页面拖入平台自带的数据导出组件,绑定对应Collection和脚本返回的ID集合,组件会自动完成Excel生成、下载全流程,适合不需要定制表格格式的快速导出场景
常见避坑:不要手动拼接CSV内容后直接改后缀为.xlsx,会导致用户下载后文件损坏无法打开;如果要导出CSV格式,需将响应头改为对应text/csv类型,同时把中文内容转GBK编码,否则Windows系统下打开会出现乱码。
内容的提问来源于stack exchange,提问作者faithfulomoy
相关产品推荐
相关产品推荐

