Class: RubyXL::Workbook
Overview
Constant Summary
collapse
- CONTENT_TYPE =
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'
- CONTENT_TYPE_WITH_MACROS =
'application/vnd.ms-excel.sheet.macroEnabled.main+xml'
- REL_TYPE =
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument'
- SHEET_NAME_FORBIDDEN_CHARS =
/[\/\\\*\[\]\:\?]/
- DATE1904 =
DateTime.new(1904, 1, 1)
- DATE1899 =
Subtracting one day to accomodate for erroneous 1900 leap year compatibility only for 1900 based dates
DateTime.new(1899, 12, 31) - 1
- MARCH_1_1900 =
61
- APPLICATION =
'Microsoft Macintosh Excel'
- APPVERSION =
'12.0000'
- SHEET_NAME_TEMPLATE =
'Sheet%d'
OOXMLTopLevelObject::ROOT, OOXMLTopLevelObject::SAVE_ORDER
Instance Attribute Summary collapse
#generic_storage, #relationship_container
#root
#local_namespaces
Instance Method Summary
collapse
#borders, #cell_xfs, #define_new_name, #each, #fills, #fonts, #get_defined_name, #get_fill_color, #modify_alignment, #modify_border, #modify_border_color, #modify_fill, #password_hash, #register_new_fill, #register_new_font, #register_new_xf
#attach_relationship, #collect_related_objects, included, #load_relationships, #store_relationship
#add_to_zip, #file_index, parse_file, set_namespaces
#==, included, #index_in_collection, #write_xml
Constructor Details
#initialize(worksheets = [], src_file_path = nil, creator = nil, modifier = nil, created_at = nil, company = '', application = APPLICATION, appversion = APPVERSION, date1904 = 0) ⇒ Workbook
Returns a new instance of Workbook.
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
|
# File 'lib/rubyXL/objects/workbook.rb', line 432
def initialize(worksheets = [], src_file_path = nil, creator = nil, modifier = nil, created_at = nil,
company = '', application = APPLICATION, appversion = APPVERSION, date1904 = 0)
super()
@worksheets = worksheets
add_worksheet if @worksheets.empty?
@theme = RubyXL::Theme.default
@shared_strings_container = RubyXL::SharedStringsTable.new
@stylesheet = RubyXL::Stylesheet.default
@relationship_container = RubyXL::OOXMLRelationshipsFile.new
@root = RubyXL::WorkbookRoot.default
@root.workbook = self
@root.source_file_path = src_file_path
creation_time = DateTime.parse(created_at) rescue DateTime.now
self.created_at = creation_time
self.modified_at = creation_time
self.company = company
self.application = application
self.appversion = appversion
self.creator = creator
self.modifier = modifier
self.date1904 = date1904 > 0
end
|
Instance Attribute Details
#worksheets ⇒ Object
Returns the value of attribute worksheets.
359
360
361
|
# File 'lib/rubyXL/objects/workbook.rb', line 359
def worksheets
@worksheets
end
|
Instance Method Details
#[](ind) ⇒ Object
Finds worksheet by its name or numerical index
463
464
465
466
467
468
|
# File 'lib/rubyXL/objects/workbook.rb', line 463
def [](ind)
case ind
when Integer then worksheets[ind]
when String then worksheets.find { |ws| ws.sheet_name == ind }
end
end
|
#add_worksheet(name = nil) ⇒ Object
Create new simple worksheet and add it to the workbook worksheets
473
474
475
476
477
478
479
480
481
482
483
484
485
|
# File 'lib/rubyXL/objects/workbook.rb', line 473
def add_worksheet(name = nil)
if name.nil? then
n = 0
begin
name = SHEET_NAME_TEMPLATE % (n += 1)
end until self[name].nil?
end
new_worksheet = Worksheet.new(:workbook => self, :sheet_name => name)
worksheets << new_worksheet
new_worksheet
end
|
#application ⇒ Object
512
513
514
|
# File 'lib/rubyXL/objects/workbook.rb', line 512
def application
root.document_properties.application && root.document_properties.application.value
end
|
#application=(v) ⇒ Object
516
517
518
519
|
# File 'lib/rubyXL/objects/workbook.rb', line 516
def application=(v)
root.document_properties.application ||= StringNode.new
root.document_properties.application.value = v
end
|
#appversion ⇒ Object
521
522
523
|
# File 'lib/rubyXL/objects/workbook.rb', line 521
def appversion
root.document_properties.app_version && root.document_properties.app_version.value
end
|
#appversion=(v) ⇒ Object
525
526
527
528
|
# File 'lib/rubyXL/objects/workbook.rb', line 525
def appversion=(v)
root.document_properties.app_version ||= StringNode.new
root.document_properties.app_version.value = v
end
|
#before_write_xml ⇒ Object
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
|
# File 'lib/rubyXL/objects/workbook.rb', line 361
def before_write_xml
max_sheet_id = worksheets.collect(&:sheet_id).compact.max || 0
self.sheets = RubyXL::Sheets.new
worksheets.each { |sheet, i|
rel = relationship_container.find_by_target(sheet.xlsx_path)
raise "Worksheet name '#{sheet.sheet_name}' contains forbidden characters" if sheet.sheet_name =~ SHEET_NAME_FORBIDDEN_CHARS
sheets << RubyXL::Sheet.new(:name => sheet.sheet_name[0..30], :sheet_id => sheet.sheet_id || (max_sheet_id += 1),
:state => sheet.state,
:r_id => rel.id)
}
true
end
|
#company ⇒ Object
503
504
505
|
# File 'lib/rubyXL/objects/workbook.rb', line 503
def company
root.document_properties.company && root.document_properties.company.value
end
|
#company=(v) ⇒ Object
507
508
509
510
|
# File 'lib/rubyXL/objects/workbook.rb', line 507
def company=(v)
root.document_properties.company ||= StringNode.new
root.document_properties.company.value = v
end
|
#created_at ⇒ Object
487
488
489
|
# File 'lib/rubyXL/objects/workbook.rb', line 487
def created_at
root.core_properties.created_at
end
|
#created_at=(v) ⇒ Object
491
492
493
|
# File 'lib/rubyXL/objects/workbook.rb', line 491
def created_at=(v)
root.core_properties.created_at = v
end
|
#creator ⇒ Object
530
531
532
|
# File 'lib/rubyXL/objects/workbook.rb', line 530
def creator
root.core_properties.creator
end
|
#creator=(v) ⇒ Object
534
535
536
|
# File 'lib/rubyXL/objects/workbook.rb', line 534
def creator=(v)
root.core_properties.creator = v
end
|
#date1904 ⇒ Object
546
547
548
|
# File 'lib/rubyXL/objects/workbook.rb', line 546
def date1904
workbook_properties && workbook_properties.date1904
end
|
#date1904=(v) ⇒ Object
550
551
552
553
|
# File 'lib/rubyXL/objects/workbook.rb', line 550
def date1904=(v)
self.workbook_properties ||= RubyXL::WorkbookProperties.new
workbook_properties.date1904 = v
end
|
#date_to_num(date) ⇒ Object
414
415
416
|
# File 'lib/rubyXL/objects/workbook.rb', line 414
def date_to_num(date)
date && (date.ajd - base_date().ajd).to_f
end
|
#modified_at ⇒ Object
495
496
497
|
# File 'lib/rubyXL/objects/workbook.rb', line 495
def modified_at
root.core_properties.modified_at
end
|
#modified_at=(v) ⇒ Object
499
500
501
|
# File 'lib/rubyXL/objects/workbook.rb', line 499
def modified_at=(v)
root.core_properties.modified_at = v
end
|
#modifier ⇒ Object
538
539
540
|
# File 'lib/rubyXL/objects/workbook.rb', line 538
def modifier
root.core_properties.modifier
end
|
#modifier=(v) ⇒ Object
542
543
544
|
# File 'lib/rubyXL/objects/workbook.rb', line 542
def modifier=(v)
root.core_properties.modifier = v
end
|
#num_to_date(num) ⇒ Object
418
419
420
421
422
423
424
425
|
# File 'lib/rubyXL/objects/workbook.rb', line 418
def num_to_date(num)
if num && num < MARCH_1_1900 then
num += 1 unless workbook_properties && workbook_properties.date1904
end
num && (base_date + num)
end
|
314
315
316
|
# File 'lib/rubyXL/objects/workbook.rb', line 314
def related_objects
[ calculation_chain, stylesheet, theme, shared_strings_container, macros ] + @worksheets
end
|
#save(dst_file_path = nil) ⇒ Object
Also known as:
write
Save the resulting XLSX file to the specified location
390
391
392
393
394
395
396
397
398
399
400
401
|
# File 'lib/rubyXL/objects/workbook.rb', line 390
def save(dst_file_path = nil)
dst_file_path ||= root.source_file_path
extension = File.extname(dst_file_path)
unless %w{.xlsx .xlsm}.include?(extension.downcase)
raise "Unsupported extension: #{extension} (only .xlsx and .xlsm files are supported)."
end
File.open(dst_file_path, "wb") { |output_file| FileUtils.copy_stream(root.stream, output_file) }
return dst_file_path
end
|
#stream ⇒ Object
Return the resulting XLSX file in a stream (useful for sending over HTTP)
385
386
387
|
# File 'lib/rubyXL/objects/workbook.rb', line 385
def stream
root.stream
end
|
#xlsx_path ⇒ Object
380
381
382
|
# File 'lib/rubyXL/objects/workbook.rb', line 380
def xlsx_path
ROOT.join('xl', 'workbook.xml')
end
|