【问题标题】:Ignore empty cells PHPExcel忽略空单元格PHPExcel
【发布时间】:2012-08-30 09:55:14
【问题描述】:

我正在使用库 PHPExcel 来读取 Excel 文件中的数据。我遇到的问题是,当我使用类似的东西时:

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

为了加载我的文件并将其内容转换为数组,我将我的 Excel 文件的所有列和行都放在我的数组中,即使是那些没有任何数据的列和行。库 PHPExcel 中是否有方法或某些东西告诉它忽略我的 Excel 工作表中不包含任何数据的单元格? (而不是在我的$data 中有一堆空的关联数组)

【问题讨论】:

  • 你想让你的数组消除它的空值(数组中的元素是空的吗?)

标签: php phpexcel


【解决方案1】:

如果您的问题在于获取真实数据的空列,并且您希望避免这些问题,您可以执行以下操作:

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

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

【讨论】:

  • 我不确定您所说的“包含真实数据的区域”是什么意思,但我的最大行数是 1000,即使我的工作表中只有大约 20 行数据。换句话说,这不会使用phpoffice/phpspreadsheet version 1.18.0 为我“过滤”出空白行。
  • 这个答案在 8 年前是正确的。我不确定 getHighestRowAndColumn 方法是否改变了它的行为,但就我而言,当我使用它时,它只返回带有数据的行。你确定你的行真的是空的吗?有时它们可​​能包含一些东西,即使它不可见。
  • 是的,它们是 NULL。不过这一切都很好。我只需要循环和过滤。我在找到第一个完全空的行时短路了循环,以避免循环遍历所有 1000 行。足够快。感谢您的回答顺便说一句。
【解决方案2】:

我的情况有这个解决方案

$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_maparray_filter($data)这种情况可以直接使用?
【解决方案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(空)值的单元格,以及只包含空单元格的每一行。它将保留数组键,因此您的数组键仍会为您提供单元格引用。

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

【讨论】:

  • 我正在尝试使用 rangeToArray() 导入具有 14k+ 行的 excel 文件,但导入需要相当长的时间,并且通常以 504 网关超时结束。你有什么建议吗?您在上面给出的示例是否比使用 rangeToArray() 更好?
  • @JCharette - 如果您正在使用大型工作簿,最好不要在内存中创建大型数组,但逐行处理(rangeToArray)可以每次从工作表中提取一行,但不要尝试将整个工作表放入数组中
  • 如果您正在处理大型工作簿,最好将其作为后台任务进行处理,而不是作为浏览器请求的一部分进行处理
  • 感谢您的推荐。我想了解如何逐行处理会更快?
  • 处理大型工作簿时,内存使用更好,因为内存中没有庞大的工作表数组以及 PHPExcel 对象;而且它通常对性能更好,因为 PHP 不需要花时间分配大量内存,尤其是因为它会在很多小(单元大小)块中请求内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多