使用RubyXL解析XLSX时如何将所有列表头合并为单个数组
解决方法
你当前的代码仅提取了表头行第9列(索引为8)的单个值,且遍历行的逻辑无实际值收集操作,可按以下方式实现表头数组提取:
基础实现(无合并单元格场景)
假设你的表头固定在工作表第1行(索引为0),直接遍历该行所有单元格收集非空值即可:
module Ccenter module Utils module ZendeskCustomFields class UpdateStatusGroup require 'rubyXL' attr_reader :workbook ,:worksheet, :data def initialize @workbook = RubyXL::Parser.parse('app/assets/files/statusgroups.xlsx') end def get_data worksheet = workbook[0] # 提取表头行所有非空值,返回数组 worksheet[0].cells.filter_map { |cell| cell&.value } end end end end end
filter_map会自动过滤空值返回结果,cell&.value用安全导航符避免空单元格报错- 最终返回值就是按列顺序排列的所有表头值数组
兼容合并单元格场景
如果表头存在合并单元格,需要先预处理合并区域的数值同步,再进行提取:
def get_data worksheet = workbook[0] # 预处理合并单元格,将主单元格值同步到合并区域所有位置 worksheet.merged_cells.each do |merged_range| ref_range = RubyXL::Reference.new(merged_range.ref) master_cell = worksheet[ref_range.row_range.first][ref_range.col_range.first] ref_range.row_range.each do |row_i| ref_range.col_range.each do |col_i| next unless worksheet[row_i] worksheet[row_i][col_i] ||= master_cell.dup end end end # 提取表头数组 worksheet[0].cells.filter_map { |cell| cell&.value } end
内容的提问来源于stack exchange,提问作者user16741832
相关产品推荐
相关产品推荐

