PHPExcel - 使用示例read fiter

时间:2013-01-01 20:18:34

标签: php filter spreadsheet phpexcel

我刚刚开始使用PHPExcel。我的非常大的电子表格无法整个加载到内存中(内存失败)。要仅加载我需要的工作表部分,我正在尝试使用文档中提供的MyReadFilter代码,但代码有点高于我,我希望有人可以帮助我理解它。

从PHPExcel文档中,这是函数:

class ReadFilter implements PHPExcel_Reader_IReadFilter 
    { 
    private $_startRow = 0; 
    private $_endRow   = 0; 
    private $_columns  = array(); 

    /**  Get the list of rows and columns to read  */ 
    public function __construct($startRow, $endRow, $columns) { 
        $this->_startRow = $startRow; 
        $this->_endRow   = $endRow; 
        $this->_columns  = $columns; 
        } 

    public function readCell($column, $row, $worksheetName = '') { 
    // Only read the rows and columns that were configured 
    if ($row >= $this->_startRow && $row <= $this->_endRow) { 
        if (in_array($column,$this->_columns)) { 
        return true; 
        } 
    } 
    return false; 
    } 
}   

我正在使用以下行来调用PHPExcel

//  Get the selected Excel file, passed from form
$testFile = $_FILES['upload_test']['tmp_name'];     
//  Identify the file type of the selected file
$inputFileType = PHPExcel_IOFactory::identify($testFile);
//  Create a reader object of the correct file type 
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//  Instantiate the filter class and apply it to the reader object
$filterSubset = new ReadFilter(1,1000,range('A','Z'));
$objReader->setReadFilter($filterSubset);       
//  Load the selected file into the reader
$objWorkbook = $objReader->load($testFile); 

我正在使用以下语法从生成的工作表对象中检索数据:

$someValue= $objWorkbook->getSheet($idx)->getCell('B11')->getCalculatedValue();

我确信我会有其他问题,但我最初的问题是关于调用该功能。如果我改变上述行:

$filterSubset = new ReadFilter(1,1000,range('A','Z'));

为:

$filterSubset = new ReadFilter(1,1000,range('A','AA'));  //Last column changed

整个读取失败。我实际上只需要来自B列的计算值,但该列的引用远远超过列AS,因此我也需要读取它们。有人可以告诉我如何使用此功能读取过去的列Z,或修改它?理想情况下,我想要的只是阅读从B到AS的十几个列的内容,但我也无法解决这个问题。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

范围('A','AA)不是有效范围.... PHP的范围函数不假设AA跟随Z.尝试使用列号代替,使用PHPExcel的columnIndexFromString()和stringFromColumnIndex()静态PHPExcel_Cell类中的方法将27转换为AA,反之亦然(注意基值0或1)。

答案 1 :(得分:2)

range('A','AA');无效,请尝试创建自己的自定义范围

示例

echo "<pre>";
print_r(xrange('AA', 'ZZ'));

使用的功能

function xrange($start, $end, $limit = 1000) {
    $l = array();
    while ($start !== $end && count($l) < $limit) {
        $l[] = $start;
        $start ++;
    }
    $l[] = $end;
    return $l;
}

See Live Demo