PHPExcel内存问题 - 更多想法?

时间:2012-09-03 16:34:24

标签: php zend-framework

我试图用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行

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我尝试使用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

答案 2 :(得分:1)

您是否尝试过PHP_XLSXWriter

这是一个简单,轻量级的XLSX编写器库。虽然不像PHP_Excel那样功能齐全,但它的设计目的是解决PHP_Excel数据导出常常遇到的一些内存和CPU使用问题。

答案 3 :(得分:1)

我遇到了一些内存问题,并为我更新了PHPExcel的最新版本。