Class: Xlsxrb::WorkbookBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/xlsxrb.rb

Overview

DSL context for Xlsxrb.build.

Instance Method Summary collapse

Constructor Details

#initializeWorkbookBuilder

Returns a new instance of WorkbookBuilder.



253
254
255
256
257
258
259
260
261
# File 'lib/xlsxrb.rb', line 253

def initialize
  @sheets = []
  @sheet_builders = [] # Keep track of sheet builders for style processing
  @defined_names = []
  @core_properties = {}
  @app_properties = {}
  @custom_properties = []
  @workbook_protection = nil
end

Instance Method Details

#add_custom_property(name, value, type: :string) ⇒ Object

Add a custom document property.



316
317
318
# File 'lib/xlsxrb.rb', line 316

def add_custom_property(name, value, type: :string)
  @custom_properties << { name: name, value: value, type: type }
end

#add_defined_name(name, value, sheet: nil, hidden: false) ⇒ Object

Add a defined name.



275
276
277
278
279
# File 'lib/xlsxrb.rb', line 275

def add_defined_name(name, value, sheet: nil, hidden: false)
  entry = { name: name, value: value, hidden: hidden }
  entry[:local_sheet_name] = sheet if sheet
  @defined_names << entry
end

#add_sheet(name = nil, &block) ⇒ Object

Add a new sheet.



264
265
266
267
268
269
270
# File 'lib/xlsxrb.rb', line 264

def add_sheet(name = nil, &block)
  name ||= "Sheet#{@sheets.size + 1}"
  sheet_builder = WorksheetBuilder.new(name)
  block.call(sheet_builder) if block_given?
  @sheet_builders << sheet_builder
  @sheets << sheet_builder.build
end

#buildObject



320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
# File 'lib/xlsxrb.rb', line 320

def build
  # Process styles from all sheets and collect style definitions
  processed_sheets, styles_definition = process_styles(@sheets)

  # Store workbook-level metadata in unmapped_data
  wb_meta = {}
  wb_meta[:defined_names] = resolve_defined_names(@defined_names, processed_sheets) unless @defined_names.empty?
  wb_meta[:core_properties] = @core_properties unless @core_properties.empty?
  wb_meta[:app_properties] = @app_properties unless @app_properties.empty?
  wb_meta[:custom_properties] = @custom_properties unless @custom_properties.empty?
  wb_meta[:workbook_protection] = @workbook_protection if @workbook_protection

  Elements::Workbook.new(
    sheets: processed_sheets,
    styles: styles_definition,
    unmapped_data: wb_meta.empty? ? {} : { facade: wb_meta }
  )
end

#set_app_property(name, value) ⇒ Object

Set an app document property.



311
312
313
# File 'lib/xlsxrb.rb', line 311

def set_app_property(name, value)
  @app_properties[name] = value
end

#set_core_property(name, value) ⇒ Object

Set a core document property.



306
307
308
# File 'lib/xlsxrb.rb', line 306

def set_core_property(name, value)
  @core_properties[name] = value
end

#set_print_area(range, sheet: nil) ⇒ Object

Set the print area for a sheet.



282
283
284
285
286
287
# File 'lib/xlsxrb.rb', line 282

def set_print_area(range, sheet: nil)
  sheet_name = sheet || @sheets.last&.name || "Sheet1"
  value = "'#{sheet_name}'!#{absolute_range(range)}"
  @defined_names.reject! { |dn| dn[:name] == "_xlnm.Print_Area" && dn[:local_sheet_name] == sheet_name }
  add_defined_name("_xlnm.Print_Area", value, sheet: sheet_name)
end

#set_print_titles(rows: nil, cols: nil, sheet: nil) ⇒ Object

Set print titles for a sheet.



290
291
292
293
294
295
296
297
298
# File 'lib/xlsxrb.rb', line 290

def set_print_titles(rows: nil, cols: nil, sheet: nil)
  sheet_name = sheet || @sheets.last&.name || "Sheet1"
  parts = []
  parts << "'#{sheet_name}'!$#{cols.sub(":", ":$")}" if cols
  parts << "'#{sheet_name}'!$#{rows.sub(":", ":$")}" if rows
  value = parts.join(",")
  @defined_names.reject! { |dn| dn[:name] == "_xlnm.Print_Titles" && dn[:local_sheet_name] == sheet_name }
  add_defined_name("_xlnm.Print_Titles", value, sheet: sheet_name)
end

#set_workbook_protection(**opts) ⇒ Object

Set workbook protection.



301
302
303
# File 'lib/xlsxrb.rb', line 301

def set_workbook_protection(**opts)
  @workbook_protection = opts
end