我试图用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行
答案 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的最新版本。