设置20个单元格类型后,PhpExcel停止工作

时间:2013-08-05 01:39:58

标签: php export phpexcel

我有一个生成一个小xls表(~25x15)的脚本。它包含百分比和字符串,我有一个if运算符,使用以下代码将当前单元格设置为百分比类型:

$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%');

但是当我导出并查看该文件时,我发现它只设置了大约20个单元格的类型和样式。其余所有都是默认设置。我调试它并意识到问题不在我的逻辑中。我读到了关于增加php缓存内存的问题 - 尝试了但它没有用。请帮忙,因为我需要出口至少15倍的桌子。提前谢谢!

3 个答案:

答案 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页面的开头加载此函数。