2

我正在尝试使用 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 致命错误:第 102 行 /Applications/MAMP/htdocs/phpexcel/library/PHPExcel/Shared/XMLWriter.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 13878925 字节)

4

4 回答 4

3

PHPExcel 网站讨论了减少内存消耗的可能方法:

于 2012-09-03T17:01:09.850 回答
1

你试过PHP_XLSXWriter吗?

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

于 2014-04-16T04:05:06.920 回答
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
于 2012-09-03T17:11:05.967 回答
1

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

于 2015-02-20T16:58:17.473 回答