Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPExcel - Using example read fiter

I'm just getting started with PHPExcel. My very large spreadsheets cannot be loaded whole into memory (memory fail). To only load the parts of the worksheet I need, I'm trying to use the MyReadFilter code that was provided in the documentation, but the code is a bit above me and I'm hoping someone can help me understand it.

From the PHPExcel documentation, here's the function:

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; 
    } 
}   

I'm using the following lines to invoke 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); 

I am retrieving data from the resulting worksheet object using this syntax:

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

I'm sure I'll have other questions as I go, but my initial one is about invoking the function. If I change the above line from:

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

to:

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

the entire read fails. I actually only need calculated values from column B, but that column has references as far over as column AS, so I need to read them as well. Can someone please tell me how to use this function to read past column Z, or to modify it? Ideally, what I'd like is to just read the contents of about a dozen columns spread out from B to AS, but I can't figure that out either.

Thanks much for any help.

like image 269
Stanton Avatar asked Feb 07 '26 05:02

Stanton


2 Answers

range('A','AA'); is not valid try creating your own custom range

Example

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

Function Used

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

See Live Demo

like image 164
Baba Avatar answered Feb 12 '26 15:02

Baba


range('A','AA) isn't a valid range.... PHP's range function doesn't assume that AA follows Z. Try using column numbers instead, using PHPExcel's columnIndexFromString() and stringFromColumnIndex() static methods in the PHPExcel_Cell class to convert 27 to AA and vice versa (watch out for the base value 0 or 1 though).

like image 29
Mark Baker Avatar answered Feb 12 '26 14:02

Mark Baker



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!