PHP:读取大量的excel文件导致致命错误

时间:2012-12-03 12:12:26

标签: php excel

我正面临一个问题。

我需要读取大约10MB的.xls文件。我写一个PHP代码,当我读小.xls文件时工作正常。但是当我尝试读取大文件时,浏览器在C:\ wamp \ www \ student \ ExcelRes \ PHPExcel \ Cell.php中显示“致命错误:允许的内存大小为134217728字节耗尽(试图分配1032字节)”在第1126行“

这是我的代码。

<?php 

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

    set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/');

    include 'PHPExcel/IOFactory.php';
    $inputFileName = 'ru_unit_H_all.xls'; 
    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);


    echo $sheetData['20007'][ 'K'];          //row colomn

?>

4 个答案:

答案 0 :(得分:2)

错误信息应该是自我解释:

“致命错误:允许的内存大小为134217728字节耗尽(试图分配1032字节)在C:\ wamp \ www \ student \ ExcelRes \第1126行上的PHPExcel \ Cell.php“

你只是耗尽了为执行一个脚本而保留的内存。

您可以使用memory_limit增加ini_set()来解决此问题。

注意:使用128MB是不够的,因为134217728B = ~128MB仍然会导致错误。尝试使用512MB

我知道没有用于PHP的Excel读取器/写入器的内存有效实现。

答案 1 :(得分:0)

脚本可用的内存已经过了。默认情况下,我相信每个脚本都有8MB的内存限制。您正在尝试读取10MB文件,因此,没有足够的内存来处理请求并且它失败。

您可以尝试使用memory_limit设置来增加可用内存量。

这可以在php.ini设置文件中的所有脚本中全局完成,也可以使用

在每个脚本的基础上完成
ini_set('memory_limit','16M');

其中16M是16兆字节的内存。

答案 2 :(得分:0)

除了可能增加内存之外,您还应该查看PHPExcel提供的单元缓存选项以实现此目的,如标题为“单元缓存”(第4.2.1节)的开发人员文档部分所述

修改

你使用toArray()也会构建你在PHP内存中请求的数组,增加额外的开销 - 考虑一次一行地迭代工作表而不是将它加载到内存中(一次作为一个PHPExcel对象,一次作为你的数组)

答案 3 :(得分:0)

最后,我使用example12代码解决了我的问题。

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/');
include 'PHPExcel/IOFactory.php';

$inputFileType = 'Excel5'; 
$inputFileName = 'ru_unit_H_all.xls'; 

class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
    private $_startRow = 0;
    private $_endRow = 0;

    public function setRows($startRow) 
    {
        $this->_startRow    = $startRow; 
    }

    public function readCell($column, $row, $worksheetName = '')
    { 
        if (($row == 1) || ($row >= $this->_startRow )) 
        {
            return true;
        }
        return false;
    }
}

$objReader = PHPExcel_IOFactory::createReader($inputFileType);

$chunkFilter = new chunkReadFilter();

$objReader->setReadFilter($chunkFilter);

$chunkFilter->setRows(22000); 
$objPHPExcel = $objReader->load($inputFileName);

echo $objPHPExcel->getActiveSheet()->getCell('K22000')->getValue();

}

?>