2

我面临一个问题。

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

这是我的代码。

<?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

4 回答 4

2

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

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

您只是用完了为执行一个脚本而保留的内存。

你可以增加你的memory_limit使用ini_set()来解决这个问题。

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

据我所知,没有针对 PHP 的 Excel 读取器/写入器的有效内存实现。

于 2012-12-03T12:15:01.077 回答
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();

}

?> 
于 2012-12-03T15:46:38.487 回答
0

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

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

这可以针对php.ini设置文件中的所有脚本全局完成,也可以使用每个脚本进行

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

16M16 兆字节的内存在哪里。

于 2012-12-03T12:17:32.167 回答
0

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

编辑

并且您对 toArray() 的使用还将在 PHP 内存中构建您请求的数组,这会增加额外的开销 - 考虑一次遍历工作表一行而不是将其两次加载到内存中(一次作为 PHPExcel 对象一次作为你的数组)

于 2012-12-03T12:28:14.830 回答