如何使用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
相关产品推荐
相关产品推荐

