我用队列来写入xlsx 用 PhpOffice\PhpSpreadsheet 还是会出现内存溢出
我后面用 PHP-Xlswriter 这个导出,无法追加写入 我用fputcsv 这个可以追加写入,但是无法创建新的sheet 大家都是咋办的
我这边是分批次导出
我也是分成好几批2w一批数据,放进队列里面, PhpOffice\PhpSpreadsheet 但是这个内容大了就会移出,难道要分文件才行吗
一定要新建sheet吗?不然使用fputcsv就可以了,分批导出到csv 再压缩到文件 10多万行 是没问题的
最好是放一个xlsx,我想看下大家有没有更好的,我现在就是fputcsv后生成一个压缩文件
大佬我还有一个问题,就是,你是直接把查询好的数据分成块传递进去,还是划定一个范围,然后在队列里面查询进行写入
我整个导出都是队列执行的,提交导出条件到队列,分块查询导出到csv,然后压缩
好的谢谢
想知道两位到底是怎么实现的,没太明白。比如 我又10W数据,每次查询一万,然后导出到CSV, 追加导入吗?
fopen拿句柄,然後分頁查詢,查詢結果裡面fput追加寫入,最後fclose後進行壓縮
Xlswriter 可以固定内存一次导出, 不用分批追加导出
大佬求源码,想看看你是怎么使用的? 还有Xlswriter是不是需要自己编译啊 能composer吗
Xlswriter 是扩展,不能 composer。使用看文档就好了
试试这个,https://github.com/jqhph/easy-excel
+1
关联扩展不维护了,不能用PHP8
上c库吧 看看这个 https://pecl.php.net/package/xlswriter
Xlswriter 支持追加导入,实测百万数据几十秒吧~
看了他的文档 ,追加导入 是怎么写的
追加写入不支持,我这里追加写入的意思是,一个文件关闭了,再打开,进行写入,我后面用的fputcsv这个,这个对表格没有样子要求感觉效果挺好的
不知道你是如何处理的,我这边是按照这种格式导出的,速度还行
// 处理路径文件以及文件名称 [$file, $object] = static::handelExcel($path, $name); // 准备导出的数据 $i = 0; Item::filter($filter)->chunkById(1000, function ($items) use ($object, &$i) { $items->each(function ($item) use ($object, &$i) { ++$i; $object = $object->data([ [ $item->title, $item->barcode, $item->category, ], ]); }); });
前端轮询处理不就行了,后端处理还废内存
https://github.com/openspout/openspout 非常好用,不管多大的数据都只占用几兆内存
楼上muyu的方案是一个很好的思路: 如果是因为一次读取太多数据行导致内存不够 这就可以解决问题。 另外,还可以考虑使用html格式 生成简单xls。
public function outPutHtmlExcel($titles, $rows, $filename) { header("Content-type:application/vnd.ms-excel"); header("Content-Disposition:filename=" . $filename . ".xls"); echo "<body><meta charset='UTF-8'><table border='1'>"; echo "<tr>"; foreach ($titles as $title) { echo "<th>$title</th>"; } echo "</tr>"; foreach ($rows as $row) { echo "<tr>"; foreach ($titles as $k => $v) { if (isset($row[$k])) { $export = str_replace(["\t", "\r", "\n", "\n\r"], '', $row[$k]) . "\t"; echo "<td style='mso-number-format: \@'>$export</td>"; } else { echo "<td></td>"; } } echo "</tr>"; } echo "</table></meta></body>"; exit(); }
只要把上面rows 那部分逻辑按照 chunkById 的形式 改造一下,我想应该可以解决你的问题。
我这里简单echo出去了,你可以考虑把它追加到特定文件里。
真幸福....我遇到的都是又要篩選,又要加背景色,又要加規則........
虽晚犹在 试试缓存处理 https://phpspreadsheet.readthedocs.io/en/latest/topics/memory_saving/
我这边是分批次导出
我也是分成好几批2w一批数据,放进队列里面, PhpOffice\PhpSpreadsheet 但是这个内容大了就会移出,难道要分文件才行吗
一定要新建sheet吗?不然使用fputcsv就可以了,分批导出到csv 再压缩到文件 10多万行 是没问题的
最好是放一个xlsx,我想看下大家有没有更好的,我现在就是fputcsv后生成一个压缩文件
大佬我还有一个问题,就是,你是直接把查询好的数据分成块传递进去,还是划定一个范围,然后在队列里面查询进行写入
我整个导出都是队列执行的,提交导出条件到队列,分块查询导出到csv,然后压缩
好的谢谢
想知道两位到底是怎么实现的,没太明白。比如 我又10W数据,每次查询一万,然后导出到CSV, 追加导入吗?
fopen拿句柄,然後分頁查詢,查詢結果裡面fput追加寫入,最後fclose後進行壓縮
Xlswriter 可以固定内存一次导出, 不用分批追加导出
大佬求源码,想看看你是怎么使用的? 还有Xlswriter是不是需要自己编译啊 能composer吗
Xlswriter 是扩展,不能 composer。使用看文档就好了
试试这个,https://github.com/jqhph/easy-excel
+1
关联扩展不维护了,不能用PHP8
上c库吧 看看这个
https://pecl.php.net/package/xlswriter
Xlswriter 支持追加导入,实测百万数据几十秒吧~
看了他的文档 ,追加导入 是怎么写的
追加写入不支持,我这里追加写入的意思是,一个文件关闭了,再打开,进行写入,我后面用的fputcsv这个,这个对表格没有样子要求感觉效果挺好的
不知道你是如何处理的,我这边是按照这种格式导出的,速度还行
前端轮询处理不就行了,后端处理还废内存
https://github.com/openspout/openspout 非常好用,不管多大的数据都只占用几兆内存
楼上muyu的方案是一个很好的思路: 如果是因为一次读取太多数据行导致内存不够 这就可以解决问题。
另外,还可以考虑使用html格式 生成简单xls。
只要把上面rows 那部分逻辑按照 chunkById 的形式 改造一下,我想应该可以解决你的问题。
我这里简单echo出去了,你可以考虑把它追加到特定文件里。
真幸福....我遇到的都是又要篩選,又要加背景色,又要加規則........
虽晚犹在
试试缓存处理
https://phpspreadsheet.readthedocs.io/en/latest/topics/memory_saving/