class Roo::Excelx::Sheet
Attributes
images[R]
Public Class Methods
new(name, shared, sheet_index, options = {})
click to toggle source
# File lib/roo/excelx/sheet.rb, line 11 def initialize(name, shared, sheet_index, options = {}) @name = name @shared = shared @sheet_index = sheet_index @images = Images.new(image_rels[sheet_index]).list @rels = Relationships.new(rels_files[sheet_index]) @comments = Comments.new(comments_files[sheet_index]) @sheet = SheetDoc.new(sheet_files[sheet_index], @rels, shared, options) end
Public Instance Methods
cells()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 21 def cells @cells ||= @sheet.cells(@rels) end
column(col_number)
click to toggle source
# File lib/roo/excelx/sheet.rb, line 57 def column(col_number) first_row.upto(last_row).map do |row| cells[[row, col_number]]&.value end end
comments()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 91 def comments @comments.comments end
dimensions()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 95 def dimensions @sheet.dimensions end
each_row(options = {}, &block)
click to toggle source
Yield each row as array of Excelx::Cell
objects accepts options max_rows (int) (offset by 1 for header), pad_cells
(boolean) and offset (int)
# File lib/roo/excelx/sheet.rb, line 39 def each_row(options = {}, &block) row_count = 0 options[:offset] ||= 0 @sheet.each_row_streaming do |row| break if options[:max_rows] && row_count == options[:max_rows] + options[:offset] + 1 if block_given? && !(options[:offset] && row_count < options[:offset]) block.call(cells_for_row_element(row, options)) end row_count += 1 end end
excelx_format(key)
click to toggle source
# File lib/roo/excelx/sheet.rb, line 82 def excelx_format(key) cell = cells[key] styles.style_format(cell.style).to_s if cell end
first_column()
click to toggle source
returns the number of the first non-empty column
# File lib/roo/excelx/sheet.rb, line 73 def first_column @first_column ||= first_last_row_col[:first_column] end
first_row()
click to toggle source
returns the number of the first non-empty row
# File lib/roo/excelx/sheet.rb, line 64 def first_row @first_row ||= first_last_row_col[:first_row] end
hyperlinks()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 87 def hyperlinks @hyperlinks ||= @sheet.hyperlinks(@rels) end
last_column()
click to toggle source
returns the number of the last non-empty column
# File lib/roo/excelx/sheet.rb, line 78 def last_column @last_column ||= first_last_row_col[:last_column] end
last_row()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 68 def last_row @last_row ||= first_last_row_col[:last_row] end
present_cells()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 25 def present_cells @present_cells ||= begin warn %{ [DEPRECATION] present_cells is deprecated. Alternate: with activesupport => cells[key].presence without activesupport => cells[key]&.presence } cells.select { |_, cell| cell&.presence } end end
row(row_number)
click to toggle source
# File lib/roo/excelx/sheet.rb, line 51 def row(row_number) first_column.upto(last_column).map do |col| cells[[row_number, col]]&.value end end
Private Instance Methods
cells_for_row_element(row_element, options = {})
click to toggle source
Take an xml row and return an array of Excelx::Cell
objects optionally pad array to header width(assumed 1st row). takes option pad_cells
(boolean) defaults false
# File lib/roo/excelx/sheet.rb, line 104 def cells_for_row_element(row_element, options = {}) return [] unless row_element cell_col = 0 cells = [] @sheet.each_cell(row_element) do |cell| cells.concat(pad_cells(cell, cell_col)) if options[:pad_cells] cells << cell cell_col = cell.coordinate.column end cells end
first_last_row_col()
click to toggle source
# File lib/roo/excelx/sheet.rb, line 122 def first_last_row_col @first_last_row_col ||= begin first_row = last_row = first_col = last_col = nil cells.each do |(row, col), cell| next unless cell&.presence first_row ||= row last_row ||= row first_col ||= col last_col ||= col if row > last_row last_row = row elsif row < first_row first_row = row end if col > last_col last_col = col elsif col < first_col first_col = col end end {first_row: first_row, last_row: last_row, first_column: first_col, last_column: last_col} end end
pad_cells(cell, last_column)
click to toggle source
# File lib/roo/excelx/sheet.rb, line 116 def pad_cells(cell, last_column) pad = [] (cell.coordinate.column - 1 - last_column).times { pad << nil } pad end