Class: RubyXL::Address

Inherits:
Object
  • Object
show all
Defined in:
lib/rubyXL/address.rb

Constant Summary collapse

ROW_REF_FORMAT =
/\A[1-9]\d*\z/
COLUMN_REF_FORMAT =
/\A[A-Z]+\z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(worksheet, ref: nil, row: nil, column: nil) ⇒ Address

Returns a new instance of Address.

Parameters:

  • worksheet (RubyXL::Worksheet)
  • ref (String, Symbol) (defaults to: nil)
  • row (Integer, String, Symbol) (defaults to: nil)
  • column (Integer, String, Symbol) (defaults to: nil)


78
79
80
81
82
83
84
# File 'lib/rubyXL/address.rb', line 78

def initialize(worksheet, ref: nil, row: nil, column: nil)
  @worksheet = worksheet

  row, column = RubyXL::Reference.ref2ind(ref) if ref
  self.row    = row
  self.column = column
end

Instance Attribute Details

#worksheet(worksheet = nil) ⇒ RubyXL::Workbook, RubyXL::Address

Parameters:

  • worksheet (RubyXL::Worksheet, nil) (defaults to: nil)

Returns:



88
89
90
91
92
93
94
# File 'lib/rubyXL/address.rb', line 88

def worksheet(worksheet = nil)
  if worksheet.nil?
    @worksheet
  else
    self.class.new(worksheet, row: @row, column: @column)
  end
end

Class Method Details

.column_ind2ref(ind) ⇒ String

Parameters:

  • ind (Integer)

Returns:

  • (String)


21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rubyXL/address.rb', line 21

def column_ind2ref(ind)
  validate_index(:column, ind)

  ref = ''.dup
  loop do
    ref.prepend((ind % 26 + 65).chr)
    ind = ind / 26 - 1
    break if ind < 0
  end
  ref.freeze
end

.column_ref2ind(ref) ⇒ Integer

Parameters:

  • ref (String, Symbol)

Returns:

  • (Integer)

Raises:

  • (ArgumentError)


44
45
46
47
48
49
# File 'lib/rubyXL/address.rb', line 44

def column_ref2ind(ref)
  message = "invalid column #{ref.inspect}"
  raise ArgumentError, message unless COLUMN_REF_FORMAT =~ ref

  ref.to_s.each_byte.reduce(0) { |a, e| a * 26 + (e - 64) } - 1
end

.row_ind2ref(ind) ⇒ String

Parameters:

  • ind (Integer)

Returns:

  • (String)


13
14
15
16
17
# File 'lib/rubyXL/address.rb', line 13

def row_ind2ref(ind)
  validate_index(:row, ind)

  (ind + 1).to_s.freeze
end

.row_ref2ind(ref) ⇒ Integer

Parameters:

  • ref (String, Symbol)

Returns:

  • (Integer)

Raises:

  • (ArgumentError)


35
36
37
38
39
40
# File 'lib/rubyXL/address.rb', line 35

def row_ref2ind(ref)
  message = "invalid row #{ref.inspect}"
  raise ArgumentError, message unless ROW_REF_FORMAT =~ ref

  ref.to_s.to_i - 1
end

Instance Method Details

#cellRubyXL::Cell?

Returns:

  • (RubyXL::Cell, nil)


191
192
193
# File 'lib/rubyXL/address.rb', line 191

def cell
  (row = @worksheet[@row]) && row[@column]
end

#column(column = nil) ⇒ Integer, RubyXL::Address

Parameters:

  • column (Integer, String, Symbol, nil) (defaults to: nil)

Returns:



108
109
110
111
112
113
114
# File 'lib/rubyXL/address.rb', line 108

def column(column = nil)
  if column.nil?
    @column
  else
    self.class.new(@worksheet, row: @row, column: column)
  end
end

#column=(column) ⇒ Integer, ...

Parameters:

  • column (Integer, String, Symbol)

Returns:

  • (Integer, String, Symbol)


124
125
126
# File 'lib/rubyXL/address.rb', line 124

def column=(column)
  @column = self.class.__send__(:normalize, :column, column)
end

#down(amount = 1) ⇒ RubyXL::Address

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:



146
147
148
# File 'lib/rubyXL/address.rb', line 146

def down(amount = 1)
  row(@row + amount)
end

#down!(amount = 1) ⇒ self

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:

  • (self)


171
172
173
174
# File 'lib/rubyXL/address.rb', line 171

def down!(amount = 1)
  self.row += amount
  self
end

#inspectString

Returns:

  • (String)


134
135
136
# File 'lib/rubyXL/address.rb', line 134

def inspect
  format('#<%s %s!%s>', self.class.name, @worksheet.sheet_name, ref)
end

#left(amount = 1) ⇒ RubyXL::Address

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:



152
153
154
# File 'lib/rubyXL/address.rb', line 152

def left(amount = 1)
  column(@column - amount)
end

#left!(amount = 1) ⇒ self

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:

  • (self)


178
179
180
181
# File 'lib/rubyXL/address.rb', line 178

def left!(amount = 1)
  self.column -= amount
  self
end

#refString

Returns:

  • (String)


129
130
131
# File 'lib/rubyXL/address.rb', line 129

def ref
  RubyXL::Reference.ind2ref(@row, @column)
end

#right(amount = 1) ⇒ RubyXL::Address

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:



158
159
160
# File 'lib/rubyXL/address.rb', line 158

def right(amount = 1)
  column(@column + amount)
end

#right!(amount = 1) ⇒ self

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:

  • (self)


185
186
187
188
# File 'lib/rubyXL/address.rb', line 185

def right!(amount = 1)
  self.column += amount
  self
end

#row(row = nil) ⇒ Integer, RubyXL::Address

Parameters:

  • row (Integer, String, Symbol, nil) (defaults to: nil)

Returns:



98
99
100
101
102
103
104
# File 'lib/rubyXL/address.rb', line 98

def row(row = nil)
  if row.nil?
    @row
  else
    self.class.new(@worksheet, row: row, column: @column)
  end
end

#row=(row) ⇒ Integer, ...

Parameters:

  • row (Integer, String, Symbol)

Returns:

  • (Integer, String, Symbol)


118
119
120
# File 'lib/rubyXL/address.rb', line 118

def row=(row)
  @row = self.class.__send__(:normalize, :row, row)
end

#up(amount = 1) ⇒ RubyXL::Address

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:



140
141
142
# File 'lib/rubyXL/address.rb', line 140

def up(amount = 1)
  row(@row - amount)
end

#up!(amount = 1) ⇒ self

Parameters:

  • amount (Integer) (defaults to: 1)

Returns:

  • (self)


164
165
166
167
# File 'lib/rubyXL/address.rb', line 164

def up!(amount = 1)
  self.row -= amount
  self
end

#valueObject

Returns:

  • (Object)


196
197
198
# File 'lib/rubyXL/address.rb', line 196

def value
  cell && cell.value
end

#value=(value) ⇒ Object

Parameters:

  • value (Object)

Returns:

  • (Object)


202
203
204
205
206
207
208
# File 'lib/rubyXL/address.rb', line 202

def value=(value)
  if cell
    cell.change_contents(value)
  else
    @worksheet.add_cell(@row, @column, value)
  end
end