Module: HasHelpers::XlsxExport

Included in:
Controller
Defined in:
app/controllers/has_helpers/xlsx_export.rb

Constant Summary collapse

VALID_AXLSX_VALUES =
%i[string integer float date time boolean].freeze
AXLSX_SHEET_NAME_BYTE_LIMIT =
31
AXLSX_SHEET_NAME_CHARMAP =
{
  ?[ => ?(,
  ?] => ?),
  ?* => "",
  ?/ => ?-,
  ?\\ => ?-,
  ?? => "",
  ?: => "",
}.freeze

Instance Method Summary collapse

Instance Method Details

#send_xlsx(sheets:, name: nil, filename: (name.present? || nil) && (/\.xlsx/.match?(name) ? name : "#{ name }.xlsx"), **options) ⇒ Object

Example

send_xlsx( sheets: [ { name: "Sheet 1", data: [["Row1", 123], ["Row2", 456]], headers: ["Name","Number"], column_types: [:string,:number] },{ name: "Sheet 2", data: [["Row1", 123], ["Row2", 456]], headers: ["Name","Number"], column_types: [:string,:number] } ], # End :sheets name: "My Report", # Will result in the filename being "My Report.xlsx" (alternative to supplying the entire filename) filename: "my-report.xlsx" # :filename and :name should be used exclusively. )



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/controllers/has_helpers/xlsx_export.rb', line 38

def send_xlsx(
  sheets:,
  name:      nil,
  filename:  (name.present? || nil) && (/\.xlsx/.match?(name) ? name : "#{ name }.xlsx"),
  **options
)
  headers["Content-Disposition"] = %Q(attachment; filename="#{ filename }")
  send_data(
    axlsx_package_from_sheets(sheets: sheets, **options).to_stream.read,
    filename: filename,
    type: ::Mime[:xlsx].to_s
  )
end