Import dữ liệu từ excel vào database trong rails

Excel.png

  1. Giới thiệu
  • Bài viết giới thiệu về gem roo được sử dụng để giúp chúng ta thao tác với dữ liệu trong file excel ở trong rails, và cụ thể là ví dụ làm sao để import dữ liệu từ file excel vào trong database.
  • Trong nhiều trường hợp, dự án của ta làm việc cho khách hàng mà họ yêu cầu dự án phải đưa được data sẵn có từ trước của họ vào trong project. Đặc biệt là trong ngành kế toán, phần lớn dữ liệu của họ được chứa sẵn ở trong file excel, mà rails chỉ cung cấp sẵn cho chúng ta làm việc với file csv. Muốn thao tác với file excel, có một số gem sẽ giúp chúng ta làm việc này, mà điển hình trong đó là gem roo.
  1. Sử dụng gem roo
  • Cách sử dụng gem roo:

    • Giả sử ta có một project sẵn có và có một model User với các thuộc tính như name:string, email:string, password:string, birthday:datetime. Và một controller để xử lí việc mà chúng ta sẽ import data từ file excel chứa các dữ liệu về các user vào database.
    • Trước tiên ta cần thêm vào trong Gemfile: gem 'roo' và chạy lệnh bundle install.
    • Trong file models/user.rb ta thêm các hàm sau:
    def self.import(file)
        spreadsheet = open_spreadsheet(file)
        header = spreadsheet.row(1)
        (2..spreadsheet.last_row).each do |i|
            row = Hash[[header, spreadsheet.row(i)].transpose]
            user = find_by_id(row["id"]) || new
            user.attributes = row.to_hash.slice(*row.to_hash.keys)
            user.save!
        end
    end
    
    def self.open_spreadsheet(file)
        case File.extname(file.original_filename)
            when ".csv" then Roo::CSV.new(file.path)
            when ".xls" then Roo::Excel.new(file.path)
            when ".xlsx" then Roo::Excelx.new(file.path)
            else raise "Unknown file type: #{file.original_filename}"
        end
    end
    
    • Thêm vào app/controllers/users_controller.rb hàm sau:
    def import
        User.import(params[:file])
        redirect_to users_path, notice: "Users imported."
    end
    
    • Thêm vào config/routes.rb định tuyến:
    resources :users do
        collection { post :import }
    end
    
    • Thêm vào file config/application.rb dòng:
    require 'roo'
    
    • Tiếp đó thêm vào trong views/users/index.html.erb:
    <h4>Import from Excel file</h4>
    <%= form_tag import_admin_users_path, multipart: true do %>
        <%= file_field_tag :file %>
        <%= submit_tag "Import", class: "btn btn-success" %>
    <% end %>
    
    • Bấy đó là đủ rồi nhé các bạn, giờ rails s thử xem nào =)). Trên trình duyệt các bạn mở link http://localhost:3000/users có một đoạn giao diện như sau:

    1.png

    • Tiếp đó các bạn click vào nút Choose File sau đó có một cửa sổ hiện lên cho các bạn chọn file excel chứa dữ liệu cần thêm vào, và giả sử có một vài dòng như sau:

    2.png

    • Sau khi chọn xong thì nhấn nút Import, hệ thống sẽ xử lí thêm dữ liệu vào database cho các bạn 😃) .
  • Tài liệu tham khảo: http://railscasts.com/episodes/396-importing-csv-and-excel