lib/rubyXL/worksheet.rb
module RubyXL
module LegacyWorksheet
include Enumerable
def initialize(params = {})
super
self.workbook = params[:workbook]
self.sheet_name = params[:sheet_name]
self.sheet_id = params[:sheet_id]
self.sheet_data = RubyXL::SheetData.new
self.cols = RubyXL::ColumnRanges.new
@comments = [] # Do not optimize! These are arrays, so they will share the pointer!
@printer_settings = []
@generic_storage = []
end
# allows for easier access to sheet_data
def [](row = 0)
sheet_data[row]
end
def each
sheet_data.rows.each { |row| yield(row) }
end
def add_row(row_index = 0, params = {})
new_row = RubyXL::Row.new(params)
new_row.worksheet = self
sheet_data.rows[row_index] = new_row
end
def add_cell(row_index = 0, column_index = 0, data = '', formula = nil, overwrite = true)
validate_workbook
validate_nonnegative(row_index)
validate_nonnegative(column_index)
row = sheet_data.rows[row_index] || add_row(row_index)
c = row.cells[column_index]
if overwrite || c.nil?
c = RubyXL::Cell.new
c.worksheet = self
c.row = row_index
c.column = column_index
if formula then
c.formula = RubyXL::Formula.new(:expression => formula)
c.raw_value = data
else
case data
when Numeric then c.raw_value = data
when String then
c.raw_value = data
c.datatype = RubyXL::DataType::RAW_STRING
when RubyXL::RichText then
c.is = data
c.datatype = RubyXL::DataType::INLINE_STRING
when Time, Date, DateTime then
c.raw_value = workbook.date_to_num(data)
when NilClass then nil
end
end
range = cols && cols.locate_range(column_index)
c.style_index = row.style_index || (range && range.style_index) || 0
row.cells[column_index] = c
end
c
end
private
# validates Workbook, ensures that this worksheet is in @workbook
def validate_workbook
unless @workbook.nil? || @workbook.worksheets.nil?
return if @workbook.worksheets.any? { |sheet| sheet.equal?(self) }
end
raise "This worksheet #{self} is not in workbook #{@workbook}"
end
# Ensures that storage space for a cell with +row_index+ and +column_index+
# exists in +sheet_data+ arrays, growing them up if necessary.
def ensure_cell_exists(row_index, column_index = 0)
validate_nonnegative(row_index)
validate_nonnegative(column_index)
sheet_data.rows[row_index] || add_row(row_index)
end
def validate_nonnegative(row_or_col)
raise 'Row and Column arguments must be nonnegative' if row_or_col < 0
end
private :validate_nonnegative
end # end class
end