【问题标题】:How to read empty cells in PHPExcel without skipping values?如何在不跳过值的情况下读取 PHPExcel 中的空单元格?
【发布时间】: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
}

有没有解决这个问题的正确方法?谢谢。

【问题讨论】:

    标签: php import-from-excel


    【解决方案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,那么你将只有这些列在数组中
    猜你喜欢
    • 2016-09-24
    • 1970-01-01
    • 2021-12-04
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多