我用隊(duì)列來(lái)寫(xiě)入xlsx 用 PhpOffice\PhpSpreadsheet 還是會(huì)出現(xiàn)內(nèi)存溢出
我后面用 PHP-Xlswriter 這個(gè)導(dǎo)出,無(wú)法追加寫(xiě)入
我用fputcsv 這個(gè)可以追加寫(xiě)入,但是無(wú)法創(chuàng)建新的sheet
大家都是咋辦的
我這邊是分批次導(dǎo)出
我也是分成好幾批2w一批數(shù)據(jù),放進(jìn)隊(duì)列里面, PhpOffice\PhpSpreadsheet 但是這個(gè)內(nèi)容大了就會(huì)移出,難道要分文件才行嗎
大佬我還有一個(gè)問(wèn)題,就是,你是直接把查詢好的數(shù)據(jù)分成塊傳遞進(jìn)去,還是劃定一個(gè)范圍,然后在隊(duì)列里面查詢進(jìn)行寫(xiě)入
想知道兩位到底是怎么實(shí)現(xiàn)的,沒(méi)太明白。比如 我又10W數(shù)據(jù),每次查詢一萬(wàn),然后導(dǎo)出到CSV, 追加導(dǎo)入嗎?
試試這個(gè),https://github.com/jqhph/easy-excel
不知道你是如何處理的,我這邊是按照這種格式導(dǎo)出的,速度還行
// 處理路徑文件以及文件名稱
[$file, $object] = static::handelExcel($path, $name);
// 準(zhǔn)備導(dǎo)出的數(shù)據(jù)
$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 非常好用,不管多大的數(shù)據(jù)都只占用幾兆內(nèi)存
樓上muyu的方案是一個(gè)很好的思路: 如果是因?yàn)橐淮巫x取太多數(shù)據(jù)行導(dǎo)致內(nèi)存不夠 這就可以解決問(wèn)題。
另外,還可以考慮使用html格式 生成簡(jiǎn)單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 的形式 改造一下,我想應(yīng)該可以解決你的問(wèn)題。