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

