忽略空单元格 PHPExcel

9

我正在使用库PHPExcel来读取Excel文件中的数据。我遇到的问题是,当我使用以下代码时:

$obj = PHPExcel_IOFactory::load($file);
$data = $obj->getActiveSheet()->toArray(null,true,true,true);

为了将我的文件加载并将其内容转换为数组,我获取Excel文件中所有的列和行,并将它们存储在数组中,即使某些单元格中没有数据。在PHPExcel库中是否有一种方法或工具可以告诉它忽略Excel表格中不包含任何数据的单元格?(而不是在我的$data中拥有大量空的关联数组)

你想让数组消除它的空值(即数组中为空的元素)吗? - sergioviniciuss
3个回答

15

如果您的问题是获取实际数据后面的空列,并且希望避免这种情况,您可以尝试像这样做:

$maxCell = $sheet->getHighestRowAndColumn();
$data = $sheet->rangeToArray('A1:' . $maxCell['column'] . $maxCell['row']);

这将返回表示仅包含实际数据的区域的数组。


我不确定你所说的“包含实际数据的区域”是什么意思,但我的最大行数是1000,即使我的工作表中只有约20行有数据。换句话说,这并不能使用phpoffice/phpspreadsheet version 1.18.0为我“过滤”空行。 - Joel Mellon
这个答案在8年前是正确的。我不确定getHighestRowAndColumn方法是否改变了其行为,但在我的情况下,当我使用它时,它只返回带有数据的行。你确定你的行真的是空的吗?有时候即使看不见,它们可能包含一些东西。 - TiGR
是的,它们是NULL。不过没关系,我只需要循环和过滤一下。当找到第一个完全空行时,我短路了循环,以避免循环遍历所有1000个。速度够快了。顺便说一句,谢谢你的答案。 - Joel Mellon

11

我有这个针对我的情况的解决方案

$maxCell = $objWorksheet->getHighestRowAndColumn();
$data = $objWorksheet->rangeToArray('A1:' . $maxCell['column'] . $maxCell['row']);

返回所有行中全部为空字符串的行:

[1] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [9] => 
            [10] => 
            [11] => 
            [12] => 
            [13] => 
        )

要删除这些空行

$data = array_map('array_filter', $data);

将返回

[1] => 数组 ( )

这是最终解决方案:

        $maxCell = $objWorksheet->getHighestRowAndColumn();
        $data = $objWorksheet->rangeToArray('A1:' . $maxCell['column'] . $maxCell['row']);
        $data = array_map('array_filter', $data);
        $data = array_filter($data);

将返回仅填充了数据的行的数组...希望这有所帮助


在这种情况下,不需要使用array_map,可以直接使用array_filter($data) - Code Slicer

3

没有。toArray() 方法返回第一个参数(NULL)来表示空单元格。然后,您可以应用标准的 PHP 数组函数(如 array_filter())来消除空单元格。

foreach($data as $key => &$row) {
    $row = array_filter($row,
                        function($cell) {
                            return !is_null($cell);
                        }
           );
    if (count($row) == 0) {
        unset($data[$key]);
    }
}
unset ($row);

这将清除所有为 NULL(空)值的单元格以及由仅为空单元格组成的每一行。它将保留数组键,因此您的数组键仍将为您提供单元格引用。

请注意,包含空字符串的单元格不是 null 单元格,因此这些单元格将被保留,尽管可以修改 array_filter() 回调以将它们也移除。


我正在尝试使用rangeToArray()导入一个包含14k+行的Excel文件,但是导入需要相当长的时间,并且经常以504网关超时结束。你有什么建议吗?上面提供的示例是否比使用rangeToArray()更好? - jlcharette
@JCharette - 如果你正在处理大型工作簿,最好不要在内存中创建大型数组,而是逐行处理(rangeToArray)可以每次从工作表中提取一行,但不要尝试将整个工作表转换为数组。 - Mark Baker
如果你正在处理大型工作簿,最好将其作为后台任务处理,而不是作为浏览器请求的一部分。 - Mark Baker
谢谢您的建议。我正在尝试理解逐行处理如何更快? - jlcharette
1
处理大型工作簿时,使用内存更高效,因为您不必将庞大的工作表数组和PHPExcel对象同时存储在内存中。这通常也有助于提高性能,因为PHP不需要花费时间分配大量内存,特别是它否则会请求许多小的(单元格大小的)内存块。 - Mark Baker
@MarkBaker 如果所有列都为空,如何删除整行 - Techy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接