如何在不跳过值的情况下读取 PHPExcel 中的空单元格?
Posted
技术标签:
【中文标题】如何在不跳过值的情况下读取 PHPExcel 中的空单元格?【英文标题】:How to read empty cells in PHPExcel without skipping values? 【发布时间】:2015-03-13 09:12:35 【问题描述】:我需要你的帮助来解决一个问题。
我试图找到答案,但没有找到。 我正在使用 phpExcel 1.8.0 从 excel 文件中读取数据。我正在使用 ReadFilter 来读取特定的列。
主要 PHP 代码。
$price = UPLOAD_DIR . $price;
$file_type = PHPExcel_IOFactory::identify($price);
$filter = new ShipperReadFilter();
$filter->getShipperSettings($shipper);
$reader = PHPExcel_IOFactory::createReader($file_type)->setReadDataOnly(true)->setReadFilter($filter)->load($price);
$worksheet = $reader->getActiveSheet();
$col_number = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestDataColumn());
$data = array();
foreach ($worksheet->getRowIterator($filter->getStartRow()) as $row)
$cellIterator = $row->getCellIterator();
$item = array();
foreach ($cellIterator as $cell)
// May be PROBLEM is Here?
array_push($item, $cell->getCalculatedValue());
array_push($data, $item);
var_dump($data);
读取过滤器代码。
class ShipperReadFilter implements PHPExcel_Reader_IReadFilter
public $valid_columns = array();
public $start_row;
public function setValidColumns ($columns)
$this->valid_columns = $columns;
public function getShipperSettings ($shipper)
switch ($shipper)
// Shipper 1
case 1 :
$this->setValidColumns(array('A', 'D', 'F'));
$this->start_row = 4;
break;
// Shipper 2
case 2 :
$this->setValidColumns(array('A', 'R', 'T'));
$this->start_row = 7;
break;
// Shipper 3
case 3 :
$this->setValidColumns(array('H', 'I', 'J'));
$this->start_row = 14;
break;
public function getStartRow ()
return $this->start_row;
public function readCell($column, $row, $worksheetName = '')
if (in_array($column, $this->valid_columns))
return true;
return false;
结果
array(3501)
[0]=> array(2)
[0]=> string(11) "01-00018239"
[1]=> float(2493)
但我需要这个
array(3501)
[0]=> array(3)
[0]=> string(11) "01-00018239"
[1]=> float(2493)
[2]=> null // or '', or 0
有没有解决这个问题的正确方法?谢谢。
【问题讨论】:
【参考方案1】:默认情况下,单元格迭代器只会遍历实际存在的单元格
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
$item = array();
foreach ($cellIterator as $cell)
array_push($item, $cell->getCalculatedValue());
但是,如果您所做的只是为每一行构建一个计算值数组,那么您可能会发现使用工作表的 rangeToArray() 方法效率更高。
编辑
仅获取与您的读取过滤器列列表匹配的单元格:
foreach ($cellIterator as $cell)
$item[$cell->getColumn()] = $cell->getCalculatedValue();
$item = array_intersect_key($item, array_flip($filter->valid_columns));
或
foreach ($cellIterator as $cell)
if(in_array($cell->getColumn(), $filter->valid_columns))
array_push($item, $cell->getCalculatedValue());
【讨论】:
谢谢你,马克。此方法有效,但现在 ReadFilter 不起作用 - 读取所有列,但我只想读取 3 列...您能帮忙吗? 读取过滤器不会读取那些超出您定义的集合的列的单元格.....如果您尝试获取未读取的列的值,您'将得到一个 NULL 因为单元格不存在....但是单元格迭代器不知道列是否应该因为过滤器而存在....它将仅迭代存在的单元格,或者迭代所有细胞 如果将单元格数组构建为关联数组,以列 id 作为索引;然后用你的托运人的列列表做一个 array_intersect_keys,那么你将只有这些列在数组中以上是关于如何在不跳过值的情况下读取 PHPExcel 中的空单元格?的主要内容,如果未能解决你的问题,请参考以下文章