module ExcelImport::Base::ClassMethods

Public Instance Methods

excel_import(role, options = {}) click to toggle source
# File lib/excel-import.rb, line 9
def excel_import(role, options = {})
  fields = options[:fields]
  default = options[:default] || {}

  class_eval %(
    def self.parse_excel_#{role}(excel_file)
      _excel_import(#{fields}, #{default}, excel_file)
    end

    def self.import_excel_#{role}(excel_file)
      models = _excel_import(#{fields}, #{default}, excel_file)
      models.each do |model|
        model.save
      end
      models
    end

    def self.get_excel_#{role}
      _excel_import_generate_sample(#{fields}, #{default})
    end
  )
end

Private Instance Methods

_excel_import(fields, default, excel_file) click to toggle source
# File lib/excel-import.rb, line 33
def _excel_import(fields, default, excel_file)
  spreadsheet = ExcelImport::ImportFile.open_spreadsheet(excel_file)

  models = []
  (2..spreadsheet.last_row).each do |i|
    row = spreadsheet.row(i)

    params = {}
    fields.each_index do |index|
      data = row[index].is_a?(Float) ? row[index].to_i.to_s : row[index].to_s
      params[fields[index]] = data
    end
    params.merge! default

    models << self.new(params)
  end
  models
end
_excel_import_generate_sample(fields, default) click to toggle source
# File lib/excel-import.rb, line 52
def _excel_import_generate_sample(fields, default)
  file = Tempfile.open [self.to_s, '.xlsx']

  output = Axlsx::Package.new
  output.workbook.add_worksheet(:name => 'sheet') do |sheet|
    field_strs = fields.map do |field|
      I18n.t("activerecord.attributes.#{self.name.downcase}.#{field}")
    end

    sheet.add_row field_strs
  end
  output.use_shared_strings = true
  output.serialize(file)
  file
end