class OoxmlParser::Coordinates

Class for working with coordinates

Constants

COLUMN_REGEXP

@return [Regexp] regexp for column name

ROW_REGEXP

@return [Regexp] regexp for row name

Attributes

column[RW]
list[RW]
row[RW]

Public Class Methods

coordinates?(string) click to toggle source

This method check is argument contains coordinate @param [String] string

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 84
def coordinates?(string)
  !/^([A-Z]+)(\d+)$/.match(string).nil?
end
get_column_name(number) click to toggle source

@param [String or Fixnum] number to convert @return [String] column’s name This method takes string like ‘12’ or ‘45’ etc. and converts into spreadsheet column’s name

StringHelper.get_column_name('12')  #=> "L"
StringHelper.get_column_name('45')  #=> "AS"
StringHelper.get_column_name('287')  #=> "KA"
# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 95
def get_column_name(number)
  (number.to_i.positive? ? ('A'..'Z').to_a[(number.to_i - 1) % 26] + get_column_name((number.to_i - 1) / 26).reverse : '').reverse
end
new(row = nil, column = nil, list = nil) click to toggle source
# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 13
def initialize(row = nil, column = nil, list = nil)
  @row = row.nil? ? row : row.to_i
  @column = column
  @list = list
end
parse_coordinates_array(arguments_string) click to toggle source

Parse array of coordinates @param arguments_string [String] string @return [Array] result

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 73
def parse_coordinates_array(arguments_string)
  result = []
  coord_array = arguments_string.split(',')
  coord_array.each do |current_coord|
    result << parser_coordinates_range(current_coord)
  end
  result
end
parser_coordinates_range(arguments_string) click to toggle source

Parse range of coordinates @param arguments_string [String] data to parse @return [Array] result

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 23
def parser_coordinates_range(arguments_string)
  return parse_coordinates_array(arguments_string) if arguments_string.include?(',')
  return warn "Formulas with # is unsupported: #{arguments_string}" if arguments_string.include?('#')
  return warn 'Formulas consists from `!` only' if arguments_string == '!'

  sheet_name = 'Sheet1'

  if arguments_string.include?('!')
    sheet_name = arguments_string.match(/.*!/).to_s
    arguments_string = arguments_string.sub(sheet_name, '')
  end

  range = arguments_string.split(':')

  difference = []
  symbols_from = range.first.scan(ROW_REGEXP).join
  symbols_to = range.last.scan(ROW_REGEXP).join
  digits_from = range.first.scan(COLUMN_REGEXP).join
  digits_to = range.last.scan(COLUMN_REGEXP).join

  difference[0] = [symbols_from, symbols_to] unless symbols_from == symbols_to
  difference[1] = [digits_from, digits_to] unless digits_from == digits_to
  arguments_array = []
  case difference.length
  when 0
    arguments_array << Coordinates.new(digits_from, symbols_from)
  when 1
    (difference.first.first..difference.first.last).each do |symbol|
      arguments_array << Coordinates.new(digits_from, symbol, sheet_name)
    end
  when 2
    case difference.first
    when nil
      (difference.last.first..difference.last.last).each do |digit|
        arguments_array << Coordinates.new(digit, symbols_from, sheet_name)
      end
    else
      (difference.first.first..difference.first.last).each do |symbol|
        (difference.last.first..difference.last.last).each do |digit|
          arguments_array << Coordinates.new(digit, symbol, sheet_name)
        end
      end
    end
  end
  arguments_array
end

Public Instance Methods

==(other) click to toggle source

Compare this object to other @param other [Object] any other object @return [True, False] result of comparision

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 147
def ==(other)
  other.is_a?(Coordinates) ? (@row == other.row && @column == other.column) : false
end
column_greater_that_other?(other_cell) click to toggle source

Compares columns of two cells @param [Coordinates] other_cell other cell coordinates @return [true, false] true, if column greater, than other row

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 131
def column_greater_that_other?(other_cell)
  column_number > other_cell.column_number
end
column_number() click to toggle source

@return [Integer] number of column This method takes @column string and converts into integer

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 115
def column_number
  @column.reverse.each_char.reduce(0) do |result, char|
    result + ((char.downcase.ord - 96) * (26**@column.reverse.index(char)))
  end
end
nil?() click to toggle source
# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 140
def nil?
  @column.nil? && @list.nil? && @row.nil?
end
parse_string(string) click to toggle source

Parse string to coordinates @param [String] string to parse @return [Coordinates] result

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 103
def parse_string(string)
  string = extract_list_from_string(string) if list_name_in_string?(string)
  if Coordinates.coordinates?(string)
    @row = string.scan(/\d/).join.to_i
    @column = string.scan(/[A-Z]/).join
  end
  self
end
row_greater_that_other?(other_cell) click to toggle source

Compares rows of two cells @param [Coordinates] other_cell other cell coordinates @return [true, false] true, if row greater, than other row

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 124
def row_greater_that_other?(other_cell)
  @row > other_cell.row
end
to_s() click to toggle source

@return [String] result of convert of object to string

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 136
def to_s
  "#{@column}#{@row} #{@list ? "list: #{@list}" : ''}"
end

Private Instance Methods

extract_list_from_string(string) click to toggle source

Extract list name and leave coordinates @param [String] string to parse @return [String] coordinates string without list

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 163
def extract_list_from_string(string)
  split = string.split('!')
  @list = split[0...-1].join('!')
  split[-1]
end
list_name_in_string?(string) click to toggle source

Check if there is list name in string @param [String] string to check @return [Boolean] result

# File lib/ooxml_parser/common_parser/common_data/coordinates.rb, line 156
def list_name_in_string?(string)
  string.include?('!')
end