module Rubyxls class Sheet FIT_TO_WIDTH = 1 ORIENTATION = :landscape GRID_LINES = false PAGE_MARGIN_TOP = 0.3 PAGE_MARGIN_LEFT = 0.3 PAGE_MARGIN_BOTTOM = 0.3 PAGE_MARGIN_RIGHT = 0.3 HEADER = 0.0 FOOTER = 0.0 LETTER_PAPER_SIZE = 1 attr_reader :sheet_name def initialize(**opts) @sheet_name = opts.fetch(:sheet_name, "Default Sheet") @style_manager = opts.fetch(:style_manager, Rubyxls::StyleManager.new) @paper_size = opts.fetch(:paper_size, LETTER_PAPER_SIZE) end def build_options(*taken_names) { page_setup: build_page_setup, print_options: build_print_options, page_margins: build_page_margins, name: unique_sheet_name(sanitize_sheet_name(@sheet_name), taken_names) } end def build_rows Rubyxls::Builders::RowBuilder.new(build_cells).rows.each do |row| row.each do |cell| cell[:style] = @style_manager.retrieve_style_attributes(cell[:style]) end end end def build_charts [] end def build_width_normalization {} end private def build_page_setup { fit_to_width: FIT_TO_WIDTH, orientation: ORIENTATION, paper_size: @paper_size } end def build_print_options { grid_lines: GRID_LINES } end def build_page_margins { top: PAGE_MARGIN_TOP, left: PAGE_MARGIN_LEFT, bottom: PAGE_MARGIN_BOTTOM, right: PAGE_MARGIN_RIGHT, header: HEADER, footer: FOOTER } end def build_cells Rubyxls::Builders::CellBuilder.new(model_data_rows: Rubyxls::ViewModel.new(title_row: true, header_row: true, additional_rows: 1, total_row: true).data_rows, start_row: 2, start_column: "B").cells end def sanitize_sheet_name(sheet_name) sheet_name.gsub(/[:\[\]\/\\\*\?]/, '-') end def unique_sheet_name(sheet_name, taken_names, index=1) return sheet_name[0, 31] unless taken_names.include?(sheet_name[0, 31]) sheet_name = "#{sheet_name[0, 29 - index.to_s.length]}(#{index})" unique_sheet_name(sheet_name, taken_names, index + 1) end end end