我有一个生成一个小xls表(~25x15)的脚本。它包含百分比和字符串,我有一个if运算符,使用以下代码将当前单元格设置为百分比类型:
$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%');
但是当我导出并查看该文件时,我发现它只设置了大约20个单元格的类型和样式。其余所有都是默认设置。我调试它并意识到问题不在我的逻辑中。我读到了关于增加php缓存内存的问题 - 尝试了但它没有用。请帮忙,因为我需要出口至少15倍的桌子。提前谢谢!
答案 0 :(得分:3)
PHPExcel分配了相当多的内存
虽然PHPExcel是一个漂亮的库,但使用它可能需要为PHP分配大量内存。
根据this thread,只有 5个单元格可以渲染6 MByte 的内存使用情况:
<?php
require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx");
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('D2', 50);
echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . "
";
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\r\n";
?>
I get 6MB of memory usage.
另一个user even failed with a 256MByte memory设置。
虽然PHPExcel提供了减少内存占用的方法,但在我的情况下,所有减少量都太小了。 This page on github提供了PHPExcel缓存管理选项的详细信息。例如,此设置序列化GZIP和工作表的单元格结构:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
PHPExcel's FAQ解释了这一点:
致命错误:允许的内存大小xxx字节耗尽(尝试过 在行aaa
的zzz中分配yyy bytes)PHPExcel拥有电子表格的“内存”表示,所以它 容易受到PHP的内存限制。记忆力可用 可以通过编辑memorylimit的值来增加PHP 你的php.ini文件中的指令,或者使用iniset('memory_limit', 代码中的“128M”(ISP允许);
有些读者和作家比其他人更快,他们也使用 不同的记忆量。你可以找到一些指示 不同阅读器和阅读器的相对性能和内存使用情况 这里有不同版本的PHPExcel的作者 http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150
如果你已经将内存增加到最大,或者无法改变你的内存 内存限制,然后这个讨论在董事会上描述了一些 可用于减少脚本内存使用量的方法 使用PHPExcel http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=242712
PHP Excel的测量结果
我检测了PHPExcel示例文件[01simple.php][5]
并进行了一些快速测试。
消耗 92 KByte :
for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
}
消耗 4164 KBytes :
for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);
}
如果多次执行此片段不变,则每个片段消耗大约4 MB。
检查您的应用在逻辑上是否正确
为了确保您的应用在逻辑上是正确的,我建议首先增加PHP内存:
ini_set('memory_limit', '32M');
在我的情况下,我必须导出到在线评估应用程序的导出结果数据。虽然水平方向的单元格少于100个,但我需要导出多达10,000个行。虽然单元格数量很大,但我的每个单元格都包含3个字符的数字或字符串 - 没有公式,没有样式。
如果内存限制较强或电子表格较大
在我的情况下,没有一个缓存选项减少了所需的数量。此外,应用程序的运行时间也大大增加。
最后,我不得不切换到老式的CSV数据文件导出。
答案 1 :(得分:2)
我在本地运行您的代码,发现您设置为此百分比的所有26个单元格都具有正确的格式和%符号。当然,我必须首先取消注释136-137行。
这必须与您的设置有关。我无法想象你对这种规模的电子表格的内存太少了。
为了您的信息,我确认它适用于PHP版本5.4.16与php excel版本1.7.6,2011-02-27。我用MS Excel 2007打开了电子表格。
答案 2 :(得分:1)
<?php
$file = 'output_log.txt';
function get_owner($file)
{
$stat = stat($file);
$user = posix_getpwuid($stat['uid']);
return $user['name'];
}
$format = "UID @ %s: %s\n";
printf($format, date('r'), get_owner($file));
chown($file, 'ross');
printf($format, date('r'), get_owner($file));
clearstatcache();
printf($format, date('r'), get_owner($file));
?>
clearstatcache()函数;可能很有用。在php页面的开头加载此函数。