require 'rubyXL/objects/ooxml_object' require 'rubyXL/objects/cell_style' require 'rubyXL/objects/font' require 'rubyXL/objects/fill' require 'rubyXL/objects/border' require 'rubyXL/objects/extensions' module RubyXL # http://www.schemacentral.com/sc/ooxml/e-ssml_numFmt-1.html class NumberFormat < OOXMLObject define_attribute(:numFmtId, :int, :required => true) define_attribute(:formatCode, :string, :required => true) define_element_name 'numFmt' def is_date_format? # v----- Toss all the escaped chars ------v v--- and see if any date-related remained !!(format_code.gsub(/(\"[^\"]*\"|\[[^\]]*\]|[\\_*].)/i, '') =~ /[dmyhs]/i) end end # http://www.schemacentral.com/sc/ooxml/e-ssml_numFmts-1.html class NumberFormats < OOXMLContainerObject define_child_node(RubyXL::NumberFormat, :collection => :with_count) define_element_name 'numFmts' DEFAULT_NUMBER_FORMATS = self.new(:_ => [ RubyXL::NumberFormat.new(:num_fmt_id => 1, :format_code => '0'), RubyXL::NumberFormat.new(:num_fmt_id => 2, :format_code => '0.00'), RubyXL::NumberFormat.new(:num_fmt_id => 3, :format_code => '#, ##0'), RubyXL::NumberFormat.new(:num_fmt_id => 4, :format_code => '#, ##0.00'), RubyXL::NumberFormat.new(:num_fmt_id => 5, :format_code => '$#, ##0_);($#, ##0)'), RubyXL::NumberFormat.new(:num_fmt_id => 6, :format_code => '$#, ##0_);[Red]($#, ##0)'), RubyXL::NumberFormat.new(:num_fmt_id => 7, :format_code => '$#, ##0.00_);($#, ##0.00)'), RubyXL::NumberFormat.new(:num_fmt_id => 8, :format_code => '$#, ##0.00_);[Red]($#, ##0.00)'), RubyXL::NumberFormat.new(:num_fmt_id => 9, :format_code => '0%'), RubyXL::NumberFormat.new(:num_fmt_id => 10, :format_code => '0.00%'), RubyXL::NumberFormat.new(:num_fmt_id => 11, :format_code => '0.00E+00'), RubyXL::NumberFormat.new(:num_fmt_id => 12, :format_code => '# ?/?'), RubyXL::NumberFormat.new(:num_fmt_id => 13, :format_code => '# ??/??'), RubyXL::NumberFormat.new(:num_fmt_id => 14, :format_code => 'm/d/yyyy'), RubyXL::NumberFormat.new(:num_fmt_id => 15, :format_code => 'd-mmm-yy'), RubyXL::NumberFormat.new(:num_fmt_id => 16, :format_code => 'd-mmm'), RubyXL::NumberFormat.new(:num_fmt_id => 17, :format_code => 'mmm-yy'), RubyXL::NumberFormat.new(:num_fmt_id => 18, :format_code => 'h:mm AM/PM'), RubyXL::NumberFormat.new(:num_fmt_id => 19, :format_code => 'h:mm:ss AM/PM'), RubyXL::NumberFormat.new(:num_fmt_id => 20, :format_code => 'h:mm'), RubyXL::NumberFormat.new(:num_fmt_id => 21, :format_code => 'h:mm:ss'), RubyXL::NumberFormat.new(:num_fmt_id => 22, :format_code => 'm/d/yyyy h:mm'), RubyXL::NumberFormat.new(:num_fmt_id => 37, :format_code => '#, ##0_);(#, ##0)'), RubyXL::NumberFormat.new(:num_fmt_id => 38, :format_code => '#, ##0_);[Red](#, ##0)'), RubyXL::NumberFormat.new(:num_fmt_id => 39, :format_code => '#, ##0.00_);(#, ##0.00)'), RubyXL::NumberFormat.new(:num_fmt_id => 40, :format_code => '#, ##0.00_);[Red](#, ##0.00)'), RubyXL::NumberFormat.new(:num_fmt_id => 45, :format_code => 'mm:ss'), RubyXL::NumberFormat.new(:num_fmt_id => 46, :format_code => '[h]:mm:ss'), RubyXL::NumberFormat.new(:num_fmt_id => 47, :format_code => 'mm:ss.0'), RubyXL::NumberFormat.new(:num_fmt_id => 48, :format_code => '##0.0E+0'), RubyXL::NumberFormat.new(:num_fmt_id => 49, :format_code => '@') ]) def find_by_format_id(format_id) self.find { |fmt| fmt.num_fmt_id == format_id } end end # http://www.schemacentral.com/sc/ooxml/e-ssml_cellStyleXfs-1.html class CellStyleXFs < OOXMLContainerObject define_child_node(RubyXL::XF, :collection => :with_count) define_element_name 'cellStyleXfs' def self.defaults self.new(:_ => [ RubyXL::XF.new(:num_fmt_id => 0, :font_id => 0, :fill_id => 0, :border_id => 0) ]) end end # http://www.schemacentral.com/sc/ooxml/e-ssml_cellXfs-1.html class CellXFs < OOXMLContainerObject define_child_node(RubyXL::XF, :collection => :with_count) define_element_name 'cellXfs' def self.defaults self.new(:_ => [ RubyXL::XF.new( :num_fmt_id => 0, :font_id => 0, :fill_id => 0, :border_id => 0, :xfId => 0 ) ]) end end # http://www.schemacentral.com/sc/ooxml/e-ssml_cellStyles-1.html class CellStyles < OOXMLContainerObject define_child_node(RubyXL::CellStyle, :collection => :with_count) define_element_name 'cellStyles' def self.defaults self.new(:_ => [ RubyXL::CellStyle.new(:builtin_id => 0, :name => 'Normal', :xf_id => 0) ]) end end # http://www.schemacentral.com/sc/ooxml/e-ssml_dxf-1.html class DXF < OOXMLObject define_child_node(RubyXL::Font) define_child_node(RubyXL::NumberFormat) define_child_node(RubyXL::Fill) define_child_node(RubyXL::Alignment) define_child_node(RubyXL::Border) define_child_node(RubyXL::Protection) define_child_node(RubyXL::ExtensionStorageArea) define_element_name 'dxf' end # http://www.schemacentral.com/sc/ooxml/e-ssml_dxfs-1.html class DXFs < OOXMLObject define_child_node(RubyXL::DXF, :collection => :with_count) define_element_name 'dxfs' end # http://www.schemacentral.com/sc/ooxml/e-ssml_tableStyle-1.html class TableStyle < OOXMLObject define_attribute(:name, :string, :required => true) define_attribute(:pivot, :bool, :default => true) define_attribute(:table, :bool, :default => true) define_attribute(:count, :int) define_element_name 'tableStyle' end # http://www.schemacentral.com/sc/ooxml/e-ssml_tableStyles-1.html class TableStyles < OOXMLContainerObject define_attribute(:defaultTableStyle, :string) define_attribute(:defaultPivotStyle, :string) define_child_node(RubyXL::TableStyle, :collection => :with_count) define_element_name 'tableStyles' end # http://www.schemacentral.com/sc/ooxml/e-ssml_colors-1.html class ColorSet < OOXMLObject define_child_node(RubyXL::Color, :collection => :true) end # http://www.schemacentral.com/sc/ooxml/e-ssml_colors-1.html class IndexedColors < OOXMLContainerObject define_child_node(RubyXL::Color, :collection => :true, :node_name => :rgbColor) define_element_name 'indexedColors' end # http://www.schemacentral.com/sc/ooxml/e-ssml_mruColors-1.html class MRUColors < OOXMLContainerObject define_child_node(RubyXL::Color, :collection => :true) define_element_name 'mruColors' end # http://www.schemacentral.com/sc/ooxml/e-ssml_colors-1.html class Colors < OOXMLObject define_child_node(RubyXL::IndexedColors) define_child_node(RubyXL::MRUColors) define_element_name 'colors' end # http://www.schemacentral.com/sc/ooxml/e-ssml_styleSheet.html class Stylesheet < OOXMLTopLevelObject define_child_node(RubyXL::NumberFormats, :accessor => :number_formats) define_child_node(RubyXL::Fonts) define_child_node(RubyXL::Fills) define_child_node(RubyXL::Borders) define_child_node(RubyXL::CellStyleXFs) define_child_node(RubyXL::CellXFs) define_child_node(RubyXL::CellStyles) define_child_node(RubyXL::DXFs) define_child_node(RubyXL::TableStyles) define_child_node(RubyXL::Colors) define_child_node(RubyXL::ExtensionStorageArea) define_element_name 'styleSheet' set_namespaces('xmlns' => 'http://schemas.openxmlformats.org/spreadsheetml/2006/main', 'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', 'xmlns:mc' => 'http://schemas.openxmlformats.org/markup-compatibility/2006', 'xmlns:x14ac' => 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac', 'xmlns:mv' => 'urn:schemas-microsoft-com:mac:vml') def initialize(*args) super @format_hash = nil end def self.filepath File.join('xl', 'styles.xml') end def self.default self.new(:fonts => RubyXL::Fonts.defaults, :fills => RubyXL::Fills.defaults, :borders => RubyXL::Borders.defaults, :cell_xfs => RubyXL::CellXFs.defaults, :cell_styles => RubyXL::CellStyles.defaults, :cell_style_xfs => RubyXL::CellStyleXFs.defaults) end def get_number_format_by_id(format_id) @format_hash ||= {} if @format_hash[format_id].nil? then @format_hash[format_id] = NumberFormats::DEFAULT_NUMBER_FORMATS.find_by_format_id(format_id) || (number_formats && number_formats.find_by_format_id(format_id)) end @format_hash[format_id] end end end