You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Roo gem遍历XLSX工作簿的所有工作表及行?

解决Roo遍历多Sheet及处理空单元格的问题

代码问题修正

你的代码里each_with_index的参数顺序搞反了,sheets是Sheet名称的数组,each_with_index会先返回元素(Sheet名称),再返回索引,循环变量顺序错误会导致逻辑混淆。修正后的基础遍历代码如下:

s = '/Users/user3/Desktop/departments.xlsx'
workbook = Roo::Spreadsheet.open(s)
# 遍历所有Sheet(reverse按倒序,可根据需求移除)
workbook.sheets.reverse.each do |sheet_name|
  sheet = workbook.sheet(sheet_name)
  # 遍历当前Sheet的每一行
  sheet.each_row do |row|
    # 处理空单元格:剔除nil或空白字符串的单元格
    cleaned_row = row.reject { |cell| cell.nil? || cell.to_s.strip.empty? }
    puts cleaned_row.inspect
  end
end

适配复杂表格的优化建议

  • 处理大量行时,用each_row_streaming替代each_row,它会逐行加载数据,避免内存占用过高:
    sheet.each_row_streaming do |row|
      # 注意:streaming模式下row是Roo::Row对象,需用cell.value获取内容
      cleaned_row = row.cells.map(&:value).reject { |v| v.nil? || v.to_s.strip.empty? }
      puts cleaned_row.inspect
    end
    
  • 若需跳过表头行,给each_row或each_row_streaming加offset: 1参数即可
  • Roo会自动忽略Sheet中的图片元素,无需额外处理非数据内容

核心逻辑说明

Roo的sheets方法确实仅返回Sheet名称数组,但通过workbook.sheet(Sheet名称/索引)就能获取对应的Sheet实例,之后调用行遍历方法即可处理多Sheet场景。

内容的提问来源于stack exchange,提问作者Rich_F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:20:19