PHPExcel 读取过滤器 Class

PHPExcel ReadFilter Class

我正在尝试将 ReadFilter 与 PHPExcel 结合使用以仅读取某些列。

我正在使用他们文档中的示例:

class columnFilter implements PHPExcel_Reader_IReadFilter
{
    private $_startRow = 0;
    private $_endRow = 0;
    private $_columns = array();

    public function __construct($startRow, $endRow, $columns) {
        $this->_startRow    = $startRow;
        $this->_endRow      = $endRow;
        $this->_columns     = $columns;
    }

    public function readCell($column, $row, $worksheetName = '') {
        if ($row >= $this->_startRow && $row <= $this->_endRow) {
            if (in_array($column,$this->_columns)) {
                return true;
            }
        }
        return false;
    }
}  

我正在使用一个名为 $importColsFilter 的数组,如下所示。我将其作为 ReadFilter 的列传递。

$importColsFilter  

Array (  
    [0] => A  
    [1] => B  
    [2] => C  
    [3] => H  
    [4] => I
    [5] => J
)  

$filterColumns = new columnFilter(2,8,$importColsFilter);
$objReader->setReadFilter($filterColumns);  
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);

当我抓取整个 sheet($sheet数据)时,我原以为只会得到 A、B、C、H、I 和 J 列。但是,我得到了A 到 J 列作为一个范围,以及介于两者之间的任何内容,如下面的数组转储所示。

$sheetData

Array (  
    [A] => CellValue1  
    [B] => CellValue2
    [C] => CellValue3
    [D] => 
    [E] => 
    [F] => 
    [G] => 
    [H] => CellValue4
    [I] => CellValue5
    [J] => CellValue6
)  

以上看起来是将范围数组而不是普通数组传递给过滤器的行为,如下所示:new columnFilter(2,8,range('A','J')) 过滤器似乎适用于抓取数据,但无论如何它都会将列转储到具有 NULL 值的数组中。这是预期的行为吗?我可以 return 我想要的列吗?

我一直在寻找使用 PHPExcel class 的干净解决方案。如果没有办法,我可以只删除 returned 为 NULL 的数组条目并将其转储到另一个数组中。下面是一个例子:

foreach(array_Keys($sheetData) as $sheetDataKey) {
    foreach($sheetData[$sheetDataKey] as $key => $value) {
        if(array_key_exists($key, $sheetData[$sheetDataKey]) && is_null($sheetData[$sheetDataKey][$key])) {
            unset($sheetData[$sheetDataKey][$key]);
        }
    }
}

class 中检查要读取的列的部分在传递给函数的数组中,它只会 return 该列。我没想到会看到列 returned 具有 NULL 值。 if (in_array($column,$this->_columns))

是否可以直接使用 PHPExcel 执行此操作,或者我应该只弹出为 NULL 的数组条目?

仅仅因为您告诉 PHPExcel 在它读取的列中留下一个空白,并不意味着 PHPExcel 将随机排列所有后续列以填补该空白....它不会。使用读取过滤器,您告诉 Reader 不要从 D、E、F 和 G 列读取任何数据,它不会....但它不会将列 H 移到列D,我转到E,等等。

D、E、F 和 G 列不能 "not exist",但是当您使用该读取过滤器时,这意味着它们将不包含任何数据,单元格将为空且不占用任何数据内存。

如果您想将 H 打乱为 D、I 为 E 等,则需要使用工作表的 removeColumn() 方法完全删除这些列。

如果您想从 $sheetData 中的一行中删除它们,那么最简单的方法是使用 array_intersect_key() 遍历这些行以消除这些列

如果我只需要从 excel 文件中获取某些列,我就制作了 PHPExcelFormatter。不幸的是它不支持 $startRow$endRow,但添加它应该很容易。

基本上就像你的columnFilter。它使用您自己的密钥输出 array

与演示 $formatterColumns 一样需要 array。例如,跳过 D-G。

<?php

// Load file
$formatter = new PHPExcelFormatter('example1.xls');

// Output columns array (document dosen't have column names on first row)
$formatterColumns = array(
    0 => 'A',
    1 => 'B',
    2 => 'C',
    7 => 'H',
    8 => 'I',
    9 => 'J'
) 

// Set our columns
$formatter->setFormatterColumns($formatterColumns);

// Output as array
$output = $formatter->output('a');

// Print array
echo '<pre>'.print_r($output, true).'</pre>';

?>

输出将是:

Array (  
    [A] => CellValue1  
    [B] => CellValue2
    [C] => CellValue3
    [H] => CellValue4
    [I] => CellValue5
    [J] => CellValue6
)