class Portable::Writers::Spreadsheet

Can write documents to an Excel file.

Constants

VERSION

Public Instance Methods

write!(filename:, data_provider: Data::Provider.new, time: Time.now.utc) click to toggle source
# File lib/portable/writers/spreadsheet.rb, line 18
def write!(filename:, data_provider: Data::Provider.new, time: Time.now.utc)
  raise ArgumentError, 'filename is required' if filename.to_s.empty?

  time_in_seconds = Benchmark.measure do
    ensure_directory_exists(filename)

    write_file(filename, data_provider, time)
  end.real

  [Result.new(filename, time_in_seconds)]
end

Private Instance Methods

add_worksheet(workbook, sheet) click to toggle source
# File lib/portable/writers/spreadsheet.rb, line 69
def add_worksheet(workbook, sheet)
  name = sheet.name.to_s.empty? ? 'Sheet1' : sheet.name

  workbook.add_worksheet(name)
end
write_data_table(worksheet, sheet, data_source, time) click to toggle source
# File lib/portable/writers/spreadsheet.rb, line 53
def write_data_table(worksheet, sheet, data_source, time)
  row_renderer = sheet_renderer.row_renderer(sheet.name, data_source.keys)

  worksheet.append_row(row_renderer.headers) if sheet.include_headers?

  data_source.data_rows.each do |row|
    worksheet.append_row(row_renderer.render(row, time))
  end
end
write_file(filename, data_provider, time) click to toggle source
# File lib/portable/writers/spreadsheet.rb, line 32
def write_file(filename, data_provider, time)
  workbook = FastExcel.open(filename, constant_memory: true)

  document.sheets.map do |sheet|
    data_source = data_provider.data_source(sheet.data_source_name)
    worksheet   = add_worksheet(workbook, sheet)

    write_head(worksheet, sheet, data_source)
    write_data_table(worksheet, sheet, data_source, time)
    write_foot(worksheet, sheet, data_source)
  end

  workbook.close
end
write_foot(worksheet, sheet, data_source) click to toggle source
# File lib/portable/writers/spreadsheet.rb, line 63
def write_foot(worksheet, sheet, data_source)
  data_source.footer_rows.each { |row| worksheet.append_row(row) }

  sheet.footer_rows.each { |row| worksheet.append_row(row) }
end
write_head(worksheet, sheet, data_source) click to toggle source
# File lib/portable/writers/spreadsheet.rb, line 47
def write_head(worksheet, sheet, data_source)
  sheet.header_rows.each { |row| worksheet.append_row(row) }

  data_source.header_rows.each { |row| worksheet.append_row(row) }
end