Skip to content

Instantly share code, notes, and snippets.

@elvisgiv
Last active April 27, 2018 15:05
Show Gist options
  • Save elvisgiv/2b2723a66c3d7ec55329fa6ff6c69c8f to your computer and use it in GitHub Desktop.
Save elvisgiv/2b2723a66c3d7ec55329fa6ff6c69c8f to your computer and use it in GitHub Desktop.

задача - сохранять данные из базы в виде таблицы excel на языке заполнения

in Gemfile

gem 'axlsx'

in lib

#../lib/proposal/project_proposal_service.rb

module Proposal
  class ProjectProposalService

    # the directory which contain .xlsx files
    FILE_DIR = "tmp/excel_form/"
    FILE_NAME = "_project_proposal"
    EXCEL_EXTENTION = ".xlsx"
    
    def self.get_or_create_dirname_of_excel_file
      directory_name = FILE_DIR
      Dir.mkdir(directory_name) unless Dir.exists?(directory_name)
      directory_name
    end
    
    def self.get_filename(id, lang)
      lang ? id.to_s + FILE_NAME + "_" + lang + EXCEL_EXTENTION :
          id.to_s + FILE_NAME + EXCEL_EXTENTION
    end

    def self.get_filepath(filename)
      directory_name = get_or_create_dirname_of_excel_file
      #
      File.join(Rails.root, directory_name, filename)
    end

    def self.items_to_excel(obj)
      Axlsx::Package.new do |p|
        p.workbook.add_worksheet(:name => "your_sheet_name_in_excel") do |sheet|
          ARRAY_OF_YOUR_ROWS_NAMES.each do |t|
            # row
            sheet.add_row [t, obj[t]] # t - row name, obj[t] - row value
          end
        end
        #
        p.serialize(obj.excel_filepath) 
      end
    end
  ...
  end
end

in model

class ProjectProposal < ActiveRecord::Base
  def excel_filename
    Proposal::ProjectProposalService.get_filename(self.id, self.lang)
  end

  def excel_filepath
    filename = self.excel_filename
    Proposal::ProjectProposalService.get_filepath(filename)
  end
end

in controller

после сохранения записи в базе, вызывается метод lib.items_to_excel(@item)

#../app/controllers/project_proposals_controller.rb

class ProjectProposalsController < SiteBaseController
  ...
  def model
    ProjectProposal
  end
  def lib
    Proposal::ProjectProposalService
  end
  def create
    @item = model.new(contact_params)
    @item.lang = params[:lang]
    #
    @res = @item.save
    respond_to do |format|
      if @res
        ...
        lib.items_to_excel(@item) # invoke creating excel file on disk
        ...
      end
    end
  end
    ...
    
  private

  def contact_params
    params.require(:project_proposal).permit(
        :email, :firstname, :lastname, :phone, :lang,
        )
  end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment