我试图使用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);当我抓取整个工作表($sheetData)时,我希望只得到列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')) --看起来过滤器可以捕获数据,但是它还是用空值将列转储到数组中。这是预期的行为吗?我能把我想要的列还回去吗?
我在寻找一个使用PHPExcel类的干净解决方案。如果没有办法,我只需删除作为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]);
}
}
}类中检查要读取的列的部分位于传递给函数的数组中,它只返回该列。我没想到会看到返回带有空值的列。if (in_array($column,$this->_columns))
不管怎么说,是否可以用直接的PHPExcel来完成这一任务,还是应该弹出为空的数组条目?
发布于 2015-04-15 07:33:11
如果只需要从excel文件中获取某些列,我就创建了PHPExcelFormatter。不幸的是,它不支持$startRow和$endRow,但是添加它应该非常容易。
这基本上就像你的columnFilter。它用自己的键输出array。
它采用array,就像在演示$formatterColumns中一样。例如,跳过D。
<?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
) 发布于 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()遍历行以消除这些列
https://stackoverflow.com/questions/29639853
复制相似问题