Module: Axlsx::Ar::SingletonMethods

Defined in:
lib/acts_as_xlsx/ar.rb

Overview

Singleton methods for the mixin

Instance Method Summary collapse

Instance Method Details

#to_xlsx(options = {}) ⇒ Object

Maps the AR class to an Axlsx package options are passed into AR find

Parameters:

  • columns (Array, Array)

    as an array of symbols or a symbol that defines the attributes or methods to render in the sheet.

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • header_style (Integer)

    to apply to the first row of field names

  • types (Array, Symbol)

    an array of Axlsx types for each cell in data rows or a single type that will be applied to all types.

  • style (Integer, Array)

    The style to pass to Worksheet#add_row

  • i18n (String)

    The path to i18n attributes. (usually activerecord.attributes)

  • package (Package)

    An Axlsx::Package. When this is provided the output will be added to the package as a new sheet. # @option options [String] name This will be used to name the worksheet added to the package. If it is not provided the name of the table name will be humanized when i18n is not specified or the I18n.t for the table name.

See Also:

  • Worksheet#add_row


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/acts_as_xlsx/ar.rb', line 48

def to_xlsx(options = {})

  row_style = options.delete(:style)
  header_style = options.delete(:header_style) || row_style
  types = [options.delete(:types) || []].flatten

  i18n = options.delete(:i18n) || self.xlsx_i18n
  columns = options.delete(:columns) || self.xlsx_columns

  p = options.delete(:package) || Package.new
  row_style = p.workbook.styles.add_style(row_style) unless row_style.nil?
  header_style = p.workbook.styles.add_style(header_style) unless header_style.nil?
  i18n = self.xlsx_i18n == true ? 'activerecord.attributes' : i18n
  sheet_name = options.delete(:name) || (i18n ? I18n.t("#{i18n}.#{table_name.underscore}") : table_name.humanize) 
  data = options.delete(:data) || [*find(:all, options)]
  data.compact!
  data.flatten!

  return p if data.empty?
  p.workbook.add_worksheet(:name=>sheet_name) do |sheet|
    
    col_labels = if i18n
                   columns.map { |c| I18n.t("#{i18n}.#{self.name.underscore}.#{c}") }                         
                 else
                   columns.map { |c| c.to_s.humanize }
                 end
    
    sheet.add_row col_labels, :style=>header_style
    
    data.each do |r|
      row_data = columns.map do |c|
        if c.to_s =~ /\./
          v = r; c.to_s.split('.').each { |method| v = v.send(method) }; v
        else
          r.send(c)                
        end
      end
      sheet.add_row row_data, :style=>row_style, :types=>types
    end
  end
  p
end