首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPExcel ReadFilter类

问PHPExcel ReadFilter类
EN

Stack Overflow用户
提问于 2015-04-15 00:57:11
回答 2查看 498关注 0票数 1

我试图使用ReadFilter和PHPExcel只读取某些列中的内容。

我使用的例子来自他们的文档:

代码语言:javascript
复制
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的列传递。

代码语言:javascript
复制
$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);

当我抓取整个工作表($sheetData)时,我希望只得到列A、B、C、H、I和J。然而,我将从A到J列作为一个范围,而在这两者之间的任何东西,如下面的数组转储所示。

代码语言:javascript
复制
$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')) --看起来过滤器可以捕获数据,但是它还是用空值将列转储到数组中。这是预期的行为吗?我能把我想要的列还回去吗?

我在寻找一个使用PHPExcel类的干净解决方案。如果没有办法,我只需删除作为NULL返回的数组条目,然后将其转储到另一个数组中。下面是一个例子:

代码语言:javascript
复制
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]);
        }
    }
}

类中检查要读取的列的部分位于传递给函数的数组中,它只返回该列。我没想到会看到返回带有空值的列。if (in_array($column,$this->_columns))

不管怎么说,是否可以用直接的PHPExcel来完成这一任务,还是应该弹出为空的数组条目?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-15 07:33:11

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

这基本上就像你的columnFilter。它用自己的键输出array。

它采用array,就像在演示$formatterColumns中一样。例如,跳过D。

代码语言:javascript
复制
<?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>';

?>

产出将是:

代码语言:javascript
复制
Array (  
    [A] => CellValue1  
    [B] => CellValue2
    [C] => CellValue3
    [H] => CellValue4
    [I] => CellValue5
    [J] => CellValue6
)  
票数 1
EN

Stack Overflow用户

发布于 2015-04-15 07:16:12

仅仅因为您告诉PHPExcel在它所读的列中留下一个空白,并不意味着PHPExcel会洗牌所有后续的列来填补这个空白.不会的。使用读取过滤器,你告诉阅读器不要读取D,E,F和G列中的任何数据,而且它不.但它不会把H列移到D列,我也不会移动到E,等等。

列D、E、F和G不能“不存在”,但是当使用读取过滤器时,就意味着它们将不包含任何数据,单元格将是空的,不会占用任何内存。

如果您想洗牌H到D,I到E等,那么您需要使用工作表的removeColumn()方法完全删除这些列。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29639853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档