0

Import - Export Xls File Rails By Gem

Chào các bạn, hôm nay mình xin giới thiệu với các bạn cách thức đơn giản để import, export data từ các file xls hoặc csv trong rails. Đây là giải pháp rất hay được sử dụng khi ứng dụng phải xử lí những data có khối lượng lớn. Những ví dụ thực tế thường áp dụng công việc import data có thể nhắc đến được ngay như import mặt hàng, import thành viên cho hệ thống...Ở những ngôn ngữ khác, vì dụ như Java thì công việc này cũng khá phức tạp nếu như ta dùng Java-Spring Batch với số lượng dòng code lớn và phức tạp. Nhưng ở Rails, mọi chuyện có vẻ nhẹ nhàng và dễ nắm bắt hơn với các GEM như axlsx, axlsx_rails hoặc roo-xls. I. Trước tiên, mình sẽ giới thiệu cách export data với gem to-xls-rails

  1. Các bạn trước tiên như mọi lần trước tiên, phải cài đặt và bundle gem to-xls-rails
  2. Sau khi cài đặt Sau khi cài xong, bạn cần cấu hình trong file RAILS_ROOT/config/initializers/mime_types.rb Mime::Type.register_alias "text/excel", :xls
  3. Bạn cần link_to để nhận request export, ví dụ <%= link_to edit_customer_path(@customer) do %> <%= button_tag "Edit" %> <% end %> Link_to trên sẽ trỏ đến customers_controller, và ở action index trong còn-trôn-lơ này, ta chỉ cần vài dòng code đơn giản: def index @customers = Customer.all respond_to do |format| format.html format.xls{send_data @customers.to_xls} end end
  4. Những phần export được thêm ở model sẽ có dạng như sau: `class Customer < ActiveRecord::Base HEADERS = %w(id first_name last_name age address tel email birth_day job) HEADERS_EXCEPT = HEADERS + %w(created_at updated_at)

def full_name "#{first_name} #{last_name}" end

class << self def perform customer HEADERS.map{|header| customer.send(header)} end end` HEADERS_EXCEPT gồm tất cả các trường trong HEADER thêm vào 2 trường created_at và updated_at để loại đi việc lặp trường II. Sau đó là phần import với roo và roo-xls

  1. Như thường lệ, ta tạo một link_to để nhận request
<%= form_for @customer, multipart: true do |f| %>
  <%= f.file_field :file, size: "70" %>
  <%= f.submit "import" %>
<% end %>
  1. Ở custormer controller
def edit
    @customer = Customer.find params["id"]
  end

  def update
    @customer = Customer.find params["id"]
    @customer = Customer.import params["customer"]["file"], @customer
    redirect_to customer_path
  end
  1. Ở model, ta cần những vật liệu này
class << self
        def import file, customer
          return unless (spreadsheet = open_spreadsheet file)
          header = spreadsheet.row 1
          row = Hash[[header, spreadsheet.row(2)].transpose]
          HEADERS.each do |field|
            customer.send "#{field}=", row[field]
          end
          customer.save
        end

        def open_spreadsheet file
          case File.extname File.basename file.path
          when ".xls" then Roo::Excel.new file.path
          when ".xlsx" then Roo::Excelx.new file.path
          end
        end
      end

Trong đây, header là dòng đầu tiên của file import, row là đơn vị duyệt từng dòng trong file để đọc Đây là một vài document mình đã tham khảo, mình cung cấp để mọi người nếu muốn tìm hiểu thêm https://github.com/nghiabk/import_and_export_xls https://github.com/roo-rb/roo https://github.com/liangwenke/to_xls-rails


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí