【问题标题】:PHPExcel Memory Problems - any more ideas?PHPExcel 内存问题 - 还有更多想法吗?
【发布时间】:2012-08-28 09:40:49
【问题描述】:

我正在尝试使用 Zend Framework 和 PHPExcel 编写 Excel2007 文件。我知道我可以增加 PHP 内存限制.. 但没有其他办法吗?

到目前为止,这是我的代码,它适用于 5000 行和 77 列,但我需要 12000 行 :-) 内存设置为 128MB

    $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_sqlite;
    PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

    $db = Zend_Db_Table_Abstract::getDefaultAdapter();
    $phpExcel = new PHPExcel();

    // set headers
    $select = $db->select();
    $select->from('IMPORT')->limit(1);
    $data = $select->query()->fetchAll();
    $columns = array_keys($data[0]);
    $phpExcel->setActiveSheetIndex(0);
    $colCNT = 1;

    foreach ($columns as $column) {
        $letter = Nc_Utils::getNameFromNumber($colCNT);
        $phpExcel->getActiveSheet()->SetCellValue($letter . '1', $column);
        $colCNT++;
    }

    unset($select);
    unset($data);

    $sql = 'SELECT * FROM IMPORT LIMIT 7000';
    $stmt = $db->query($sql);

    $rowCNT = 2;
    while($rows = $stmt->fetch()){
        $phpExcel->getActiveSheet()->fromArray($rows, null, 'A'.$rowCNT);
        $rowCNT++;
    }  

    unset($rowCNT);
    unset($select);
    unset($db);

    // MEMORY USAGE = 4 MB!

    $phpExcelWrite = new PHPExcel_Writer_Excel2007($phpExcel);
    $phpExcelWrite->setUseDiskCaching(true);
    $phpExcelWrite->save(str_replace('.php', '.xls', __FILE__));

PHP 致命错误:允许的内存大小为 134217728 字节已用尽 (试图分配 13878925 字节)在 /Applications/MAMP/htdocs/phpexcel/library/PHPExcel/Shared/XMLWriter.php 在第 102 行

【问题讨论】:

  • 不。 Excel 并不是一种可以小块“流式传输”的格式。整个事情必须保存在内存中,所以增加内存限制。

标签: php zend-framework


【解决方案1】:

我遇到了一些内存问题,更新到最新版本的 PHPExcel 提高了我的性能。

【讨论】:

    【解决方案2】:

    你试过PHP_XLSXWriter吗?

    它是一个简单、轻量级的 php XLSX 编写器库。虽然不如 PHP_Excel 功能全面,但它旨在解决 PHP_Excel 数据导出经常面临的一些内存和 CPU 使用问题。

    【讨论】:

      【解决方案3】:

      我尝试使用PhpExcel,但发现与您相同的问题。 我已经尝试了所有减少内存消耗的建议(Klinky 在他的回答中发布的链接)但只得到了 25-30% 的改进。我什至考虑过创建 CSV 输出而不是 excel。

      现在我正在使用 PEAR 的 Spreadsheet_Excel_Writer,它对我来说工作正常,数据量大致相同(11k 行 62 列),但生成文件需要相当长的时间。

      它没有PhpExcel 强大,但正如我在您的示例中看到的那样,您并没有使用它来设置单元格样式和编写函数,对吧?

      例子:

      $workbook = new Spreadsheet_Excel_Writer();
      $workbook->send($filename . '.xls');
      $workbook->setVersion(8); // excel 8
      // Create worksheet
      $worksheet =& $workbook->addWorksheet('submissions');
      $worksheet->setInputEncoding('UTF-8');
      // Write some data on Sheet 1
      $row = 0;
      $worksheet->write($row, 0, 'Poster #ID');
      $worksheet->write($row, 1, 'Surname');
      $worksheet->write($row, 2, 'Firstname');
      $worksheet->write($row, 3, 'Country');
      $worksheet->write($row, 4, 'E-mail');
      $worksheet->write($row, 5, 'All authors');
      $worksheet->write($row, 6, 'Institutions');
      $worksheet->write($row, 7, 'Abstract topic');
      $worksheet->write($row, 8, 'Abstract title');
      foreach ($records as $rec_id => $rec_data) {
          $row++;
          $worksheet->write($row, 0, 'P-' . $rec_data['id']);
          $worksheet->write($row, 1, $rec_data['submitter_surname']);
          $worksheet->write($row, 2, $rec_data['submitter_firstname']);
          $worksheet->write($row, 3, $rec_data['submitter_country']);
          $worksheet->write($row, 4, $rec_data['submitter_email']);
          $worksheet->write($row, 5, $rec_data['authors']);
          $worksheet->write($row, 6, $rec_data['institutions']);
          $worksheet->write($row, 7, $rec_data['abstract_topic']);
          $worksheet->write($row, 8, $rec_data['abstract_title']);
      }
      $workbook->close(); // output
      

      【讨论】:

      • 只是对此威胁的更新,Spreadsheet_Excel_Writer 不再维护。
      • ... 由于“调用时传递引用”的使用,不再维护并且与 PHP 5.4+ 不兼容。
      【解决方案4】:

      PHPExcel 网站has a discussion 关于减少内存消耗的可能方法:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-31
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多