require'rubyXL/objects/ooxml_object'require'rubyXL/objects/simple_types'require'rubyXL/objects/text'require'rubyXL/objects/formula'require'rubyXL/cell'require'rubyXL/convenience_methods'moduleRubyXL# http://www.schemacentral.com/sc/ooxml/e-ssml_v-1.htmlclassCellValue<OOXMLObjectdefine_attribute(:_,:string,:accessor=>:value)define_attribute(:'xml:space',:string)define_element_name'v'defbefore_write_xmlself.xml_space=(value.is_a?(String)&&((value=~/\A\s/)||(value=~/\s\Z/)||value.include?("\n")))?'preserve':niltrueendend# http://www.schemacentral.com/sc/ooxml/e-ssml_c-2.htmlclassCell<OOXMLObjectdefine_attribute(:r,:ref)define_attribute(:s,:int,:default=>0,:accessor=>:style_index)define_attribute(:t,RubyXL::ST_CellType,:accessor=>:datatype,:default=>'n')define_attribute(:cm,:int,:default=>0)define_attribute(:vm,:int,:default=>0)define_attribute(:ph,:bool,:default=>false)define_child_node(RubyXL::Formula,:accessor=>:formula)define_child_node(RubyXL::CellValue,:accessor=>:value_container)define_child_node(RubyXL::RichText)# isdefine_element_name'c'defindex_in_collectionr.col_range.beginenddefrowr&&r.first_rowenddefrow=(v)self.r=RubyXL::Reference.new(v,column||0)enddefcolumnr&&r.first_colenddefcolumn=(v)self.r=RubyXL::Reference.new(row||0,v)enddefraw_valuevalue_container&&value_container.valueenddefraw_value=(v)self.value_container||=RubyXL::CellValue.newvalue_container.value=venddefnumber_formatworkbook.stylesheet.get_number_format_by_id(get_cell_xf.num_fmt_id)enddefis_date?returnfalseunlessraw_value=~/\A\d+(?:\.\d+)?\Z/# Only fully numeric values can be datesnum_fmt=self.number_formatnum_fmt&&num_fmt.is_date_format?end# Gets massaged value of the cell, converting datatypes to those known to Ruby (that includes# stripping any special formatting from RichText).defvalue(args={})returnraw_valueifargs[:raw]casedatatypewhenRubyXL::DataType::SHARED_STRINGthenworkbook.shared_strings_container[raw_value.to_i].to_selseifis_date?thenworkbook.num_to_date(raw_value.to_f)elsifraw_value.is_a?(String)&&(raw_value=~/\A-?\d+(\.\d+(?:e[+-]\d+)?)?\Z/i)# Numericif$1thenraw_value.to_felseraw_value.to_iendelseraw_valueendendendincludeLegacyCellincludeCellConvenienceMethodsend#TODO#<row r="1" spans="1:1" x14ac:dyDescent="0.25"># http://www.schemacentral.com/sc/ooxml/e-ssml_row-1.htmlclassRow<OOXMLObjectdefine_attribute(:r,:int)define_attribute(:spans,:string)define_attribute(:s,:int,:default=>0,:accessor=>:style_index)define_attribute(:customFormat,:bool,:default=>false)define_attribute(:ht,:double)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:worksheetdefindex_in_collectionr-1enddef[](ind)cells[ind]enddefsizecells.sizeenddefinsert_cell_shift_right(c,col_index)cells.insert(col_index,c)update_cell_coords(col_index)enddefdelete_cell_shift_left(col_index)cells.delete_at(col_index)update_cell_coords(col_index)enddefupdate_cell_coords(start_from_index)cells.drop(start_from_index).each_with_index{|cell,i|nextifcell.nil?cell.column=start_from_index+i}endprivate:update_cell_coordsdefxf@worksheet.workbook.cell_xfs[self.style_index||0]enddefget_fill_color@worksheet.workbook.get_fill_color(xf)enddefget_font@worksheet.workbook.fonts[xf.font_id]endend# http://www.schemacentral.com/sc/ooxml/e-ssml_sheetData-1.htmlclassSheetData<OOXMLObjectdefine_child_node(RubyXL::Row,:collection=>true,:accessor=>:rows)define_element_name'sheetData'def[](ind)rows[ind]enddefsizerows.sizeendendend