Class: RubyXL::WorkbookRoot

Inherits:
Object
  • Object
show all
Includes:
RelationshipSupport
Defined in:
lib/rubyXL/objects/root.rb

Constant Summary collapse

@@debug =
nil

Instance Attribute Summary collapse

Attributes included from RelationshipSupport

#generic_storage, #relationship_container

Class Method Summary collapse

Instance Method Summary collapse

Methods included from RelationshipSupport

#attach_relationship, #collect_related_objects, included, #load_relationships, #store_relationship

Instance Attribute Details

#content_typesObject

Returns the value of attribute content_types


12
13
14
# File 'lib/rubyXL/objects/root.rb', line 12

def content_types
  @content_types
end

#filepathObject

Returns the value of attribute filepath


12
13
14
# File 'lib/rubyXL/objects/root.rb', line 12

def filepath
  @filepath
end

#rels_hashObject

Returns the value of attribute rels_hash


12
13
14
# File 'lib/rubyXL/objects/root.rb', line 12

def rels_hash
  @rels_hash
end

Class Method Details

.defaultObject


26
27
28
29
30
31
32
33
# File 'lib/rubyXL/objects/root.rb', line 26

def self.default
  obj = self.new
  obj.document_properties    = RubyXL::DocumentPropertiesFile.new
  obj.core_properties        = RubyXL::CorePropertiesFile.new
  obj.relationship_container = RubyXL::OOXMLRelationshipsFile.new
  obj.content_types          = RubyXL::ContentTypes.new
  obj
end

.parse_file(xl_file_path, opts = {}) ⇒ Object


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/rubyXL/objects/root.rb', line 62

def self.parse_file(xl_file_path, opts = {})
  begin
    ::Zip::File.open(xl_file_path) { |zip_file|
      root = self.new
      root.filepath = xl_file_path
      root.content_types = RubyXL::ContentTypes.parse_file(zip_file, ContentTypes::XLSX_PATH)
      root.load_relationships(zip_file, OOXMLTopLevelObject::ROOT)

      wb = root.workbook
      wb.root = root

      wb.sheets.each_with_index { |sheet, i|
        sheet_obj = wb.relationship_container.related_files[sheet.r_id]

        wb.worksheets[i] = sheet_obj # Must be done first so the sheet becomes aware of its number
        sheet_obj.workbook = wb

        sheet_obj.sheet_name = sheet.name
        sheet_obj.sheet_id = sheet.sheet_id
        sheet_obj.state = sheet.state
      }

      root
    }
  rescue ::Zip::Error => e
    raise e, "XLSX file format error: #{e}", e.backtrace
  end
end

Instance Method Details


22
23
24
# File 'lib/rubyXL/objects/root.rb', line 22

def related_objects
  [ content_types, thumbnail, core_properties, document_properties, custom_properties, workbook ]
end

#streamObject


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/rubyXL/objects/root.rb', line 35

def stream
  stream = Zip::OutputStream.write_buffer { |zipstream|
    self.rels_hash = {}
    self.relationship_container.owner = self
    collect_related_objects.compact.each { |obj|
      puts "<-- DEBUG: adding relationship to #{obj.class}" if @@debug
      obj.root = self if obj.respond_to?(:root=)
      self.rels_hash[obj.class] ||= []
      self.rels_hash[obj.class] << obj
    }

    self.rels_hash.keys.sort_by{ |c| c::SAVE_ORDER }.each { |klass|
      puts "<-- DEBUG: saving related #{klass} files" if @@debug
      self.rels_hash[klass].each { |obj|
        puts "<-- DEBUG:   > #{obj.xlsx_path}" if @@debug
        obj.add_to_zip(zipstream)
      }
    }
  }
  stream.rewind
  stream
end

#xlsx_pathObject


58
59
60
# File 'lib/rubyXL/objects/root.rb', line 58

def xlsx_path
  OOXMLTopLevelObject::ROOT
end