2013-03-20 86 views
3

我有一个Excel文件(97-2003),我需要能够通过PHP导入和有它在文件中转换只是一个片CSV。这些是由用户上传的,所以没有办法手动进行。它需要用PHP。在XLS文件,以CSV与PHPExcel转换单张 - 内存耗尽

我目前使用PHPExcel,这是工作的罚款,直到我们得到了与超过33,000行的文件......这是给一个致命的PHP的错误:Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 97 bytes) in [pathtophpexcel]\PHPExcel\Worksheet.php on line 11231

有没有什么办法可以进一步优化此,或者PHPExcel在处理巨大的表单时不正确?我使用的代码相当简单,所以不确定是否可以进一步优化它,但手指交叉了!下面是我使用的代码:

$reader = PHPExcel_IOFactory::createReader('Excel5'); 
$reader->setReadDataOnly(true); 
$reader->setLoadSheetsOnly('Details'); 

$excel = $reader->load($filename); 

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV'); 
$writer->save($filename_fixed); 

如果PHPExcel不适合这份工作,那我最好用?

编辑 - 这是马克的建议

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp; 
$cacheSettings = array('memoryCacheSize' => '2GB'); 
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

$reader = PHPExcel_IOFactory::createReader('Excel5'); 
$reader->setReadDataOnly(true); 
$reader->setLoadSheetsOnly('Details'); 

$excel = $reader->load($filename); 

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV'); 
$writer->save($filename_fixed); 
+0

第4.2.1试试这个代码http://php-drops.blogspot.in/2011/04/read-excel-sheet-xls-file-with- php.html – Vineet1982 2013-03-20 17:51:12

+1

您是否尝试过使用PHP的单元缓存来减少内存使用量? – 2013-03-20 21:07:58

+0

干杯@MarkBaker,完美的工作!不确定是否要将其作为正确答案发布,我会将其标记为已回答? – BT643 2013-03-21 13:15:16

回答

4

PHPExcel 1.7.3介绍cell caching作为一种机制,以减少PHP内存的限制范围内保持较大的工作簿的内存使用情况后,工作代码。细胞缓存通过串行化单元数据以减小其尺寸,或允许被保持PHP存储器的外部单元中的数据与唯一的“存储中”保持单元的索引提供了一个折衷减少存储器使用任一;但在性能上会付出代价。

默认情况下,电池将高速缓存在内存中存储的最佳速度的所有细胞;但其他的缓存选项包括:

  • 拉上内存
  • 连载中存储
  • igbinary内存连载
  • 红色磁盘
  • APC
  • 的memcache
  • WINCACHE
  • phptemp
  • sqlite的sqlite3的或数据库

速度和内存使用它们之间的变化,也将取决于操作平台和其他setings,所以你需要找出哪些是你自己的情况来使用的最佳选择;但作为一般指导原则,内存使用效率越高,性能越低。是最近添加 SQLite的选项,并提供最佳的内存使用情况,因为即使是“细胞指数”是不是在内存中保存,目前我测试了一些变化,看看我是否能提高sqlite的执行速度。

用途是覆盖在开发者文档

+0

工作正常,我们与phptemp细胞缓存需要再次..谢谢!用“固定”版本更新我的代码。 – BT643 2013-03-21 14:16:36