diff --git a/lib/roo/excelx/coordinate.rb b/lib/roo/excelx/coordinate.rb index acd08aeb..4f61b178 100644 --- a/lib/roo/excelx/coordinate.rb +++ b/lib/roo/excelx/coordinate.rb @@ -1,15 +1,18 @@ module Roo class Excelx - class Coordinate - attr_accessor :row, :column + class Coordinate < ::Array def initialize(row, column) - @row = row - @column = column + super() << row << column + freeze end - def to_a - @array ||= [row, column].freeze + def row + self[0] + end + + def column + self[1] end end end diff --git a/lib/roo/excelx/sheet_doc.rb b/lib/roo/excelx/sheet_doc.rb index bade7ac4..9402ddd3 100755 --- a/lib/roo/excelx/sheet_doc.rb +++ b/lib/roo/excelx/sheet_doc.rb @@ -44,8 +44,7 @@ def each_cell(row_xml) # If you're sure you're not going to need this hyperlinks you can discard it coordinate = ::Roo::Utils.extract_coordinate(cell_element[COMMON_STRINGS[:r]]) hyperlinks = unless @options[:no_hyperlinks] - key = coordinate.to_a - hyperlinks(@relationships)[key] + hyperlinks(@relationships)[coordinate] end yield cell_from_xml(cell_element, hyperlinks, coordinate) @@ -200,8 +199,7 @@ def extract_cells(relationships) extracted_cells = {} doc.xpath('/worksheet/sheetData/row/c').each do |cell_xml| coordinate = ::Roo::Utils.extract_coordinate(cell_xml[COMMON_STRINGS[:r]]) - key = coordinate.to_a - extracted_cells[key] = cell_from_xml(cell_xml, hyperlinks(relationships)[key], coordinate) + extracted_cells[coordinate] = cell_from_xml(cell_xml, hyperlinks(relationships)[coordinate], coordinate) end expand_merged_ranges(extracted_cells) if @options[:expand_merged_ranges] diff --git a/lib/roo/utils.rb b/lib/roo/utils.rb index 8e8f7787..484d9190 100644 --- a/lib/roo/utils.rb +++ b/lib/roo/utils.rb @@ -4,7 +4,7 @@ module Utils LETTERS = ('A'..'Z').to_a - def extract_coord(s, klass = Excelx::Coordinate) + def extract_coordinate(s) num = letter_num = 0 num_only = false @@ -22,20 +22,16 @@ def extract_coord(s, klass = Excelx::Coordinate) end fail ArgumentError if letter_num == 0 || !num_only - if klass == Array - [num, letter_num] - else - klass.new(num, letter_num) - end + Excelx::Coordinate.new(num, letter_num) end - alias_method :extract_coordinate, :extract_coord + alias_method :ref_to_key, :extract_coordinate def split_coordinate(str) - extract_coord(str, Array) + warn "[DEPRECATION] `Roo::Utils.split_coordinate` is deprecated. Please use `Roo::Utils.extract_coordinate` instead." + extract_coordinate(str) end - alias_method :ref_to_key, :split_coordinate def split_coord(str) @@ -72,8 +68,8 @@ def num_cells_in_range(str) cells = str.split(':') return 1 if cells.count == 1 raise ArgumentError.new("invalid range string: #{str}. Supported range format 'A1:B2'") if cells.count != 2 - x1, y1 = split_coordinate(cells[0]) - x2, y2 = split_coordinate(cells[1]) + x1, y1 = extract_coordinate(cells[0]) + x2, y2 = extract_coordinate(cells[1]) (x2 - (x1 - 1)) * (y2 - (y1 - 1)) end