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

如何使用Ruby读取Excel指定行与列的目标数据

Ruby 操作spreadsheet库读取Excel的实现方案

你之前无法提取目标值的核心原因是未通过行[列索引]的格式定位具体单元格,spreadsheet库读取xls文件时行列索引均从0开始计数,对应你提供的表结构:列0为Elemento列,列1为Status列,索引0的行为表头行,索引1及以后为数据行。

以下是覆盖全部需求的可运行基础初始化代码:

require 'spreadsheet'
Spreadsheet.client_encoding = 'UTF-8'
book = Spreadsheet.open('C:/temp/pasta1.xls', "r")
sheet = book.worksheet 0

需求1:读取Status列数据首行值为'Invisível'的对应数据

target_data = nil
sheet.each_with_index do |row, row_idx|
  next if row_idx == 0 # 跳过表头行
  # 定位到Status列数据第一行(行索引1),判断值匹配
  if row_idx == 1 && row[1]&.strip == 'Invisível'
    target_data = {
      elemento_value: row[0],
      status_value: row[1]
    }
    break
  end
end
# 输出结果:{:elemento_value=>"Nº Hidrômetro", :status_value=>"Invisível"}
pp target_data

需求2:仅读取Status列所有值

status_list = []
sheet.each_with_index do |row, row_idx|
  next if row_idx == 0 # 不需要表头可保留这行,需要表头则删除
  status_list << row[1]&.strip
end
# 输出结果:["Invisível", "Invisível", "Invisível", "Invisível"]
pp status_list

需求3:仅读取Elemento列所有值

elemento_list = []
sheet.each_with_index do |row, row_idx|
  next if row_idx == 0 # 不需要表头可保留这行,需要表头则删除
  elemento_list << row[0]&.strip
end
# 输出结果:["Nº Hidrômetro", "Leitura", "Diâmetro do HD", "Filtro"]
pp elemento_list

需求4:读取表格全量行列数据

full_table_data = []
sheet.each do |row|
  next if row.compact.empty? # 跳过空行
  full_table_data << {
    elemento: row[0]&.strip,
    status: row[1]&.strip
  }
end
pp full_table_data

注:代码中&.strip是为了处理单元格值前后可能存在的不可见空格、换行符,避免值匹配失败。如果需要读取指定范围的行/列,只需要在遍历时加索引判断即可,比如读取第2到第4行数据就判断row_idx.between?(1,3)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:48:23