gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:36:23 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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解释这个:

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 KB:

for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
}

消耗 4164 KB:

for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);
}

如果多次执行这个片段而不改变,每个片段消耗大约 4 MBytes。

检查您的应用在逻辑上是否正确

为了确保您的应用在逻辑上是正确的,我建议首先增加 PHP 内存:

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

在我的例子中,我必须导出在线评估申请的结果数据。虽然水平单元格少于 100 个,但我需要导出多达 10.000 行。虽然单元格的数量很大,但我的每个单元格都包含一个数字或一个由 3 个字符组成的字符串——没有公式,也没有样式。

如果有很强的内存限制或大型电子表格

在我的例子中,没有一个缓存选项减少了所需的数量。此外,应用程序的运行时间大大增加。

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

关于设置 20 种单元格类型后 PhpExcel 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com