summaryrefslogtreecommitdiffstats
path: root/lib/roo/excelx/sheet.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/roo/excelx/sheet.rb')
-rw-r--r--lib/roo/excelx/sheet.rb59
1 files changed, 49 insertions, 10 deletions
diff --git a/lib/roo/excelx/sheet.rb b/lib/roo/excelx/sheet.rb
index add92f0..840a053 100644
--- a/lib/roo/excelx/sheet.rb
+++ b/lib/roo/excelx/sheet.rb
@@ -4,11 +4,15 @@ module Roo
class Sheet
extend Forwardable
- delegate [:styles, :workbook, :shared_strings, :rels_files, :sheet_files, :comments_files] => :@shared
+ delegate [:styles, :workbook, :shared_strings, :rels_files, :sheet_files, :comments_files, :image_rels] => :@shared
+
+ attr_reader :images
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)
@@ -19,7 +23,14 @@ module Roo
end
def present_cells
- @present_cells ||= cells.select { |_, cell| cell && !cell.empty? }
+ @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
# Yield each row as array of Excelx::Cell objects
@@ -39,33 +50,33 @@ module Roo
def row(row_number)
first_column.upto(last_column).map do |col|
- cells[[row_number, col]]
- end.map { |cell| cell && cell.value }
+ cells[[row_number, col]]&.value
+ end
end
def column(col_number)
first_row.upto(last_row).map do |row|
- cells[[row, col_number]]
- end.map { |cell| cell && cell.value }
+ cells[[row, col_number]]&.value
+ end
end
# returns the number of the first non-empty row
def first_row
- @first_row ||= present_cells.keys.map { |row, _| row }.min
+ @first_row ||= first_last_row_col[:first_row]
end
def last_row
- @last_row ||= present_cells.keys.map { |row, _| row }.max
+ @last_row ||= first_last_row_col[:last_row]
end
# returns the number of the first non-empty column
def first_column
- @first_column ||= present_cells.keys.map { |_, col| col }.min
+ @first_column ||= first_last_row_col[:first_column]
end
# returns the number of the last non-empty column
def last_column
- @last_column ||= present_cells.keys.map { |_, col| col }.max
+ @last_column ||= first_last_row_col[:last_column]
end
def excelx_format(key)
@@ -107,6 +118,34 @@ module Roo
(cell.coordinate.column - 1 - last_column).times { pad << nil }
pad
end
+
+ 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
end
end
end