class RubyReport::Generator::Xlsx

def add_report(report, worksheet_name:)

def add_report(report, worksheet_name:)
  reports << {
    report: report,
    worksheet: Worksheet.new(workbook, sanitize_worksheet_name(worksheet_name)),
  }
end

def generate

def generate
  reports.each do |report|
    worksheet = report[:worksheet]
    report = report[:report]
    worksheet.add_header(report.header)
    report.each_row do |row|
      next if row.empty?
      worksheet.add_row(sanitize_row(row))
    end
  end
  package.to_stream
end

def initialize

def initialize
  @package = ::Axlsx::Package.new.tap { |package| package.use_shared_strings = true }
  @workbook = package.workbook
  @reports = []
end

def sanitize_row(row)

def sanitize_row(row)
  row.map do |el|
    el.is_a?(String) && el.start_with?(*XLSX_XSS_SYMBOLS) ? "'#{el}" : el
  end
end

def sanitize_worksheet_name(name)

def sanitize_worksheet_name(name)
  truncate(name.gsub(ESCAPE_REGEXP, ""), WORKSHEET_LETTERS_COUNT)
end

def truncate(string, length)

def truncate(string, length)
  string.length > length ? string[0...length] : string
end