【问题标题】:Spreadsheet::ParseExcel row_range differs from gnumericSpreadsheet::ParseExcel row_range 与 gnumeric 不同
【发布时间】:2013-05-30 22:06:58
【问题描述】:
我无法让Spreadsheet::ParseExcel 解析由gnumeric 生成的.xls 电子表格,我认为问题出在gnumeric。当仅使用 285 行时,ParseExcel 的 row_range() 方法返回 (0, 500)。
我尝试选择单元格 A1 - I285,然后选择 文件 > 打印区域 > 设置打印区域,然后使用我的 Perl 脚本保存和处理 .xls 文件,但没有任何效果。
该文件实际上包含两个工作表。一个正确计算行数,而另一个没有。我创建了两个工作表,但不知道我可能会做些什么不同。
【问题讨论】:
标签:
perl
gnumeric
parseexcel
【解决方案1】:
当仅使用 285 行时,ParseExcel 的 row_range() 方法返回 (0, 500)。
Spreadsheet::ParseExcel 从存储最大和最小行和列值的 Excel 文件中的二进制记录中读取 row_range() 数据。它不会遍历工作表来计算这些值。
因此,如果 row_range() 将 (0, 500) 报告为正在使用的行范围,那么这些值就是存储在该记录中的值。
差异的根源可能是包含格式但没有数据的行。 Excel 区分“空”单元格和“空白”单元格。 “空”单元格是不包含数据的单元格,而“空白”单元格是不包含数据但包含格式的单元格。 Excel 存储“空白”单元格,但忽略“空”单元格。
我尝试选择单元格 A1 - I285,然后选择文件 > 打印区域 > 设置打印区域,然后使用我的 Perl 脚本保存和处理 .xls 文件,但没有任何效果。
打印区域对row_range() 报告的范围没有影响。
如果您确实想将文件减少到包含行的 285 个数据,请从 286-501 中选择行,删除它们,然后保存文件。
或者,将您的程序设置为忽略仅包含包含空白数据的单元格的行。
【解决方案2】:
我怀疑它会计算包含不可打印字符的行数,但除非您发布代码,否则我无法确定。
如果是不可打印的字符,请尝试在导致问题的任何循环中插入这个坏男孩:
next unless $cell;