Mar*_*tin 8 php export phpexcel
我有一个生成一个小xls表(~25x15)的脚本.它包含百分比和字符串,我有一个if运算符,使用以下代码将当前单元格设置为百分比类型:
$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%');
Run Code Online (Sandbox Code Playgroud)
但是当我导出并查看文件时,我发现它只设置了约20个单元格的类型和样式.其余所有都是默认设置.我调试它并意识到问题不在我的逻辑中.我读到了关于增加php缓存内存的问题 - 尝试了但它没有用.请帮忙,因为我需要出口至少15倍的桌子.提前致谢!
PHPExcel 分配相当多的内存
虽然 PHPExcel 是一个漂亮的库,但使用它可能需要为 PHP 分配大量内存。
根据此线程,仅5 个单元就可以呈现 6 MB的内存使用量:
<?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.
Run Code Online (Sandbox Code Playgroud)
另一位用户甚至以 256MByte 内存设置失败。
虽然 PHPExcel 提供了减少内存占用的方法,但在我的例子中,所有减少都太小了。github 上的此页面提供了 PHPExcel 缓存管理选项的详细信息。例如,此设置对工作表的单元格结构进行序列化和 GZIP:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
Run Code Online (Sandbox Code Playgroud)
PHPExcel 的常见问题解答对此进行了解释:
致命错误:aaa 行上的 zzz 中允许的 xxx 字节内存大小已耗尽(尝试分配 yyy 字节)
PHPExcel 保存电子表格的“内存中”表示形式,因此它容易受到 PHP 内存限制的影响。可以通过编辑 php.ini 文件中的 memorylimit 指令的值,或在代码中使用 iniset('memory_limit', '128M') 来增加 PHP 可用的内存(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 KB:
for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
}
Run Code Online (Sandbox Code Playgroud)
消耗4164 KB:
for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);
}
Run Code Online (Sandbox Code Playgroud)
如果不加修改地多次执行该片段,则每个片段将消耗大约 4 MB 的空间。
检查您的应用程序在逻辑上是否正确
为了确保您的应用程序在逻辑上正确,我建议首先增加 PHP 内存:
ini_set('memory_limit', '32M');
Run Code Online (Sandbox Code Playgroud)
就我而言,我必须导出在线评估应用程序的结果数据。虽然水平单元格少于 100 个,但我需要导出多达 10,000 行。虽然单元格数量很大,但我的每个单元格都包含一个数字或 3 个字符的字符串 - 没有公式,没有样式。
如果存在强大的内存限制或大型电子表格
就我而言,没有任何缓存选项可以根据需要减少数量。此外,应用程序的运行时间也大幅增长。
最后我不得不切换到老式的 CSV 数据文件导出。
| 归档时间: |
|
| 查看次数: |
1487 次 |
| 最近记录: |