我刚刚开始使用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的十几个列的内容,但我也无法解决这个问题。
非常感谢您的帮助。
答案 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;
}