【问题标题】:Use PHPexcel to find highest non-empty column/row cheaply (on Google Sheets export)使用 PHPexcel 廉价地找到最高的非空列/行(在 Google 表格导出上)
【发布时间】:2016-02-11 11:50:07
【问题描述】:

在 PHPExcel 中导入从 Google 表格导出的 .xlsx 文件时,PHPexcel 方法 $worksheet->getHighestDataColumn()$worksheet->getHighestDataRow() 都返回 Google Docs 中设置的最大值,包括完全空的单元格,通常为 26x1000。

据我所知,当在 Google 表格/Excel 中打开它们时,这些单元格与常规的空 Excel 单元格一样是空的,即没有空格。

也许 Google 表格使用与 Excel 稍有不同的方法来“保留”列和行(后者是动态生成的)。

我想获得最高的非空行,以便在循环行时不会不必要地分配大量内存。尊重我使用的格式,我可以在空行中保存一些评估,但最后,我不得不简单地遍历所有行并检查所有单元格是否为空。

【问题讨论】:

  • NULL 和空字符串 ("") 都是 MS Excel 单元格的有效值,这就是 PHPExcel 的 getHighestDataColumn() 方法能够识别它们的原因
  • 但是识别包含这些值的单元格的唯一方法是加载工作表并检查单元格内容,所以我看不到任何节省内存的实用方法,除了将阅读器修改为测试值并丢弃为 NULL 或 "" 的单元格
  • @MarkBaker 感谢您的快速回复。只是从 Google 导入的工作表显然与 Excel 中的工作表在如何“保留”空(完全未触及的自动生成的单元格)方面略有不同。也许,如果 Google 表格变得更普遍,getHighestNonemptyColumn 方法将是可取的(但我已经为自己的具体情况考虑了这一点)。
  • 从我在github上Cells classPHPOffice/PhpSpreadsheet的源代码中可以看到,无论如何,内部循环遍历每个单元格
  • 不幸的是,由于 xlsx 格式的特性,PHPExcel 总是将整个 xlsx 文件加载到内存中(而且非常消耗),因此,我建议移至 .csv,因为它已集成在 PHP 中,而您可以轻松实现惰性和优化处理。

标签: php google-sheets phpexcel


【解决方案1】:

如果您愿意在 Google Apps 脚本中创建自定义函数,不妨看看这个答案。在导出之前使用它,这样你就知道有多少行进来了。它找到单列的最后一行。但是,由于它基于速度,您可能会发现它比其他方法更快地遍历每一列。

对于您的脚本,在遍历 myLastRow() 的结果的 forEach 循环上尝试 Math.max:

Determining the last row in a single column

我注意到您没有指定列在结束前是否有空单元格。上面的链接确实要求所有单元格不为空(在 Google 表格中)。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2020-08-15
    • 2022-11-16
    相关资源
    最近更新 更多