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

我有一个脚本可以生成一个xls表(〜25x15)。它包含百分比和字符串和我有一个,如果操作者将当前单元格为百分比型与此代码:PhpExcel在设置20个单元格类型后停止工作

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

但是,当我出口,并期待在我看到这个文件只管理设置的类型和风格有关20个细胞。其余的都是默认设置。我调试它,并意识到这个问题不在我的逻辑。我读了关于增加php缓存内存 - 尝试了它,但它没有奏效。请帮忙,因为我需要导出至少15倍大的表格。提前致谢!

回答:

<?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页面的开始加载这个函数。

回答:

PHPExcel分配相当长的一段记忆

虽然PHPExcel是一个美丽的图书馆,使用它可能需要分配给PHP大量内存。

根据this thread,只是5细胞可使得存储器使用的6兆字节:

<?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解释这一点:

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa

PHPExcel holds an "in memory" representation of a spreadsheet, so it is susceptible to PHP's memory limitations. The memory made available to PHP can be increased by editing the value of the memorylimit directive in your php.ini file, or by using iniset('memory_limit', '128M') within your code (ISP permitting);

Some Readers and Writers are faster than others, and they also use differing amounts of memory. You can find some indication of the relative performance and memory usage for the different Readers and Writers, over the different versions of PHPExcel, here http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150

If you've already increased memory to a maximum, or can't change your memory limit, then this discussion on the board describes some of the methods that can be applied to reduce the memory usage of your scripts using PHPExcel http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=242712

为PHP的Excel

我仪表的PHPExcel测量结果示例文件[01simple.php][5]并做了一些快速测试

消耗92 K字节:

for($n=0; $n<200; $n++) { 

$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');

}

消耗4164千字节:

for($n=0; $n<200; $n++) { 

$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');

$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);

}

如果一个执行该片段几次不变,每个片段消耗约4兆字节。

检查您的应用程序是逻辑上是正确

要确保,你的应用是逻辑上是正确的,我会建议首先增加PHP内存:

ini_set('memory_limit', '32M'); 

就我而言,我不得不导出到在线评估应用程序的导出结果数据。虽然水平少于100个单元格,但我需要导出多达10.000行。尽管细胞数量很大,但我的每个细胞都拥有一个数字或一串3个字符 - 没有公式,也没有样式。

在强大的内存限制或大型电子表格

在我的情况下,要求无缓存选项减少量一样多。另外,应用程序的运行时间也大大增加。

最后,我不得不切换到老式的CSV数据文件导出。

回答:

我在本地运行您的代码,发现您设置为该百分比的所有26个单元格都具有正确的格式和%符号。当然,我必须先取消第136-137行的注释。

这必须与您的设置有关。我无法想象,对于这种尺寸的电子表格,内存太少。

为了您的信息,我确认它使用PHP版本5.4.16与PHP的Excel版本1.7.6,2011年2月27日。我使用MS Excel 2007打开了电子表格。

以上是 PhpExcel在设置20个单元格类型后停止工作 的全部内容, 来源链接: utcz.com/qa/265242.html

回到顶部