从大型数据集

时间:2018-06-04 18:23:42

标签: php out-of-memory phpspreadsheet

我正在尝试从包含60k条目的数组创建电子表格(XLSX)。当它导出时,它会给我一个电子表格,上面没有任何其他的PHP OOM警告。

    $spreadsheet = new Spreadsheet();
    $spreadsheet->setActiveSheetIndex(0);
    $activeSheet = $spreadsheet->getActiveSheet();

    $rowIndex = 2;

    foreach ($this->_values as $_val){
        $activeSheet->setCellValueByColumnAndRow(1, $rowIndex, trim($_val['item1']));
        $activeSheet->setCellValueByColumnAndRow(2, $rowIndex, trim($_val['item2']));
        $activeSheet->setCellValueByColumnAndRow(3, $rowIndex, trim($_val['item3']));
        $activeSheet->setCellValueByColumnAndRow(4, $rowIndex, trim($_val['item4']));
        $activeSheet->setCellValueByColumnAndRow(5, $rowIndex, trim($_val['item5']));
        $activeSheet->setCellValueByColumnAndRow(6, $rowIndex, trim($_val['item6']));
        $activeSheet->setCellValueByColumnAndRow(7, $rowIndex, trim($_val['item7']));
        $activeSheet->setCellValueByColumnAndRow(8, $rowIndex, trim($_val['item8']));
        $activeSheet->setCellValueByColumnAndRow(9, $rowIndex, trim($_val['item9']));
        $activeSheet->setCellValueByColumnAndRow(10, $rowIndex, trim($_val['item10']));
        $activeSheet->setCellValueByColumnAndRow(11, $rowIndex, trim($_val['item11']));

        $rowIndex += 1;
    }

    $spreadsheet->garbageCollect();

    $writer = new Xlsx($spreadsheet);
    $writer->setPreCalculateFormulas(false);
    $writer->setUseDiskCaching(true);
    $writer->save("php://temp");

    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);

1 个答案:

答案 0 :(得分:0)

内存不足错误是因为您的系统内存不足。假设您的系统具有空间

,您可以increase the amount of memory使用类似ini_set('memory_limit', '750M');的内容

或者,如果不需要XLSX(即:如果您可以使用CSV,Excel仍然可以打开),您可以将数据流式传输到电子表格,而不是一次性将其全部加载到内存中,然后打印。这看起来像这样:

foreach ($this->_values as $_val){
    for($i=1; $i<=11; $i++) {
        echo trim($_val['item'.$i]);
        if($i<11) echo ",";
    }
    echo "\n";
}

您也可以include the CSV header at the top of the PHP file,因此页面会提示下载而不是向您显示CSV文件的内容。这是CSV标题cal:header("Content-type: text/csv");