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