lib/rubyXL/objects/sheet_data.rb
require 'rubyXL/objects/ooxml_object'
require 'rubyXL/objects/simple_types'
require 'rubyXL/objects/text'
require 'rubyXL/objects/formula'
module RubyXL
# http://www.schemacentral.com/sc/ooxml/e-ssml_v-1.html
class CellValue < OOXMLObject
define_attribute(:_, :string, :accessor => :value)
define_element_name 'v'
end
# http://www.schemacentral.com/sc/ooxml/e-ssml_c-2.html
class Cell < OOXMLObject
define_attribute(:r, :ref)
define_attribute(:s, :int, :accessor => :style_index)
define_attribute(:t, RubyXL::ST_CellType, :accessor => :datatype, :default => 'n', )
define_attribute(:cm, :int)
define_attribute(:vm, :int)
define_attribute(:ph, :bool)
define_child_node(RubyXL::Formula, :accessor => :formula)
define_child_node(RubyXL::CellValue, :accessor => :value_container)
define_child_node(RubyXL::RichText) # is
define_element_name 'c'
def index_in_collection
r.col_range.begin
end
def row
r && r.first_row
end
def row=(v)
self.r = RubyXL::Reference.new(v, column || 0)
end
def column
r && r.first_col
end
def column=(v)
self.r = RubyXL::Reference.new(row || 0, v)
end
def raw_value
value_container && value_container.value
end
def raw_value=(v)
self.value_container ||= RubyXL::CellValue.new
value_container.value = v
end
def value(args = {})
return raw_value if args[:raw]
case datatype
when RubyXL::Cell::SHARED_STRING then
workbook.shared_strings_container[raw_value.to_i]
else
if is_date? then workbook.num_to_date(raw_value.to_i)
elsif raw_value.is_a?(String) && (raw_value =~ /^-?\d+(\.\d+(?:e[+-]\d+)?)?$/i) # Numeric
if $1 then raw_value.to_f
else raw_value.to_i
end
else raw_value
end
end
end
include LegacyCell
end
#TODO#<row r="1" spans="1:1" x14ac:dyDescent="0.25">
# http://www.schemacentral.com/sc/ooxml/e-ssml_row-1.html
class Row < OOXMLObject
define_attribute(:r, :int)
define_attribute(:spans, :string)
define_attribute(:s, :int)
define_attribute(:customFormat, :bool, :default => false)
define_attribute(:ht, :float)
define_attribute(:hidden, :bool, :default => false)
define_attribute(:customHeight, :bool, :default => false)
define_attribute(:outlineLevel, :int, :default => 0)
define_attribute(:collapsed, :bool, :default => false)
define_attribute(:thickTop, :bool, :default => false)
define_attribute(:thickBot, :bool, :default => false)
define_attribute(:ph, :bool, :default => false)
define_child_node(RubyXL::Cell, :collection => true, :accessor => :cells)
define_element_name 'row'
attr_accessor :worksheet
def index_in_collection
r - 1
end
def [](ind)
cells[ind]
end
def size
cells.size
end
def insert_cell_shift_right(c, col_index)
cells.insert(col_index, c)
col_index.upto(cells.size) { |col|
cell = cells[col]
next if cell.nil?
cell.column = col
}
end
def delete_cell_shift_left(col_index)
cells.delete_at(col_index)
col_index.upto(cells.size) { |col|
cell = cells[col]
next if cell.nil?
cell.column = col
}
end
def xf
@worksheet.workbook.cell_xfs[self.s || 0]
end
def get_fill_color
@worksheet.workbook.get_fill_color(xf)
end
def get_font
@worksheet.workbook.fonts[xf.font_id]
end
end
# http://www.schemacentral.com/sc/ooxml/e-ssml_sheetData-1.html
class SheetData < OOXMLObject
define_child_node(RubyXL::Row, :collection => true, :accessor => :rows)
define_element_name 'sheetData'
def [](ind)
rows[ind]
end
def size
rows.size
end
end
end