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
)
我正在尝试将 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
)