我用隊列來寫入xlsx 用 PhpOffice\PhpSpreadsheet 還是會出現(xiàn)內(nèi)存溢出
我后面用 PHP-Xlswriter 這個導(dǎo)出,無法追加寫入
我用fputcsv 這個可以追加寫入,但是無法創(chuàng)建新的sheet
大家都是咋辦的
不知道你是如何處理的,我這邊是按照這種格式導(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,
],
]);
});
});
樓上muyu的方案是一個很好的思路: 如果是因?yàn)橐淮巫x取太多數(shù)據(jù)行導(dǎo)致內(nèi)存不夠 這就可以解決問題。
另外,還可以考慮使用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 的形式 改造一下,我想應(yīng)該可以解決你的問題。