如何在不跳过值的情况下读取 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 中的空单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不跳过文档的情况下更新window.location.hash?

Xcopy共享违规,如何仍然复制而不跳过

Rx .NET 在某些情况下跳过值更改

“更改开”中有两个值的条形图,跳过值为 0 的条形图

如何忽略错误但不跳过 redshift 复制命令中的行

如果不与其他表共享 ID,如何从 SQL 中跳过值