开始,通过使用读取滤波器仅加载ID列:
/** Define a Read Filter class implementing PHPExcel_Reader_IReadFilter */
class SingleColumnFilter implements PHPExcel_Reader_IReadFilter
{
private $requestedColumn;
public function __construct($column) {
$this->requestedColumn = $column;
}
public function readCell($column, $row, $worksheetName = '') {
if ($column == $this->requestedColumn) {
return true;
}
return false;
}
}
/** Create an Instance of our Read Filter **/
$idColumnFilter = new SingleColumnFilter('B'); // Id is column B
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objReader->setLoadSheetsOnly($sheetnames);
/** Tell the Reader that we want to use the Read Filter **/
$objReader->setReadFilter($idColumnFilter);
/** Load only the column that matches our filter to PHPExcel **/
$objPHPExcel = $objReader->load($inputFileName);
然后PHPExcel将在B
列细胞仅负载数据。然后,您可以在单元的子集中搜索所需的值(1列和22,000行仅为22,000个单元,所以应该比加载整个文件所需的2.5MB要接近35MB),然后使用类似的根据行号进行过滤,只加载已识别的单个行。
编辑
最新的1.8.1版本PHPExcel也具有columnIterator应该更容易来循环下来寻找特定ID值的列:
$found = false;
foreach ($objPHPExcel->getActiveSheet()->getColumnIterator('B') as $column) {
$cellIterator = $column->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(true);
foreach ($cellIterator as $key => $cell) {
if ($cell->getValue == 'ABC') {
$found = true;
$rowId = $cell->getRow()
break 2;
}
}
编辑# 2
一旦你确定了你想要的行,你可以使用第二个过滤器来重新加载Excel文件......但只有那一行:
/** Define a Read Filter class implementing PHPExcel_Reader_IReadFilter */
class SingleRowFilter implements PHPExcel_Reader_IReadFilter
{
private $requestedRow;
public function __construct($row) {
$this->requestedRow = $row;
}
public function readCell($column, $row, $worksheetName = '') {
if ($row == $this->requestedRow) {
return true;
}
return false;
}
}
if ($found) {
/** Create an Instance of our Read Filter **/
$rowFilter = new SingleRowFilter($rowId);
$objReader2 = PHPExcel_IOFactory::createReader('Excel2007');
$objReader2->setReadDataOnly(true);
$objReader2->setLoadSheetsOnly($sheetnames);
/** Tell the Reader that we want to use the Read Filter **/
$objReader2->setReadFilter($rowFilter);
/** Load only the single row that matches our filter to PHPExcel **/
$objPHPExcel2 = $objReader2->load($inputFileName);
}
小心,PHPExcel是内存贪婪。对于每个单元格,它需要高达1K的内存。所以对于你的20000行(以及68列),你需要高达20 * 68M的空闲RAM ...... – Random
你有没有试过像读取过滤器的东西?你可以设置一个过滤器来只读ID列,在那里搜索,然后只读取匹配的行? –
@Random?每个细胞1Mo?!?!?当然你会开玩笑!我的“经验法则”估计实际上是32位PHP中的1k/cell,64位PHP中的1.6k/cell –