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.
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
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With