Ruby使用collect读取Excel行遇空单元格报错的解决方法
Ruby读取Excel空单元格报错修复方案
报错根因:索引12的位置为空单元格时,num[12]返回nil,直接对nil调用.value方法会触发NoMethodError。以下两种方案直接替换原有代码即可落地:
方案1:空单元格读取为空字符串(保留原表行对应关系)
适合需要保持返回列表长度和原表行数一致、不打乱行位置的场景。
- Ruby 2.3及以上版本(绝大多数现有环境)直接用安全导航符+类型转换,代码最简洁:
@list = $workbook.worksheets[0].collect { |row| row[12]&.value.to_s }
逻辑说明:&.是Ruby内置安全导航操作符,当前面的row[12]为空(nil)时会直接返回nil,不会继续调用.value触发报错;末尾的.to_s会自动把nil转换为空字符串"",非空单元格的原有值也会正常保留。
- 低版本Ruby兼容写法:
@list = $workbook.worksheets[0].collect do |row| cell = row[12] cell.nil? ? "" : cell.value end
方案2:直接跳过空单元格(仅保留非空值)
适合不需要对齐原表行位置、只需要收集该列所有有效内容的场景。
- Ruby 2.7及以上版本用
filter_map一步完成收集+过滤空值:
@list = $workbook.worksheets[0].filter_map { |row| row[12]&.value }
- 低版本Ruby兼容写法:先收集所有值,再剔除nil项
@list = $workbook.worksheets[0].collect { |row| row[12]&.value }.compact
小提示:原代码块参数里写的
|num,|末尾多余逗号属于Ruby参数解构的特殊写法,遍历工作表行时不需要加,直接写单参数接收行对象即可,避免不必要的语法歧义。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

