12/08/2018, 14:09

Export CSV, Excel

Đôi khi người sử dụng muốn xử lý dữ liệu theo cách mà họ muốn. Trong tình huống như vậy thì chúng ta nên xuất dữ liệu trong một định dạng bảng để người dùng có thể dùng các trình soạn thảo để làm bất kỳ điều gì họ muốn. Bài viết này giới thiệu đến mọi người cách đơn giản nhất để export dữ liệu ra ...

Đôi khi người sử dụng muốn xử lý dữ liệu theo cách mà họ muốn. Trong tình huống như vậy thì chúng ta nên xuất dữ liệu trong một định dạng bảng để người dùng có thể dùng các trình soạn thảo để làm bất kỳ điều gì họ muốn.

Bài viết này giới thiệu đến mọi người cách đơn giản nhất để export dữ liệu ra file CSV/Excel.

Để đơn giản thì mình giả sử mình đang muốn xuất dữ liệu của bảng Product ( gồm 2 cột là ID và Name)

I. Export CSV

  • Đầu tiền ta sử dụng thư viện CSV để tạo ra dữ liệu CSV, bằng cách như sau.

Thêm vào file config/application.rb như sau

require File.expand_path('../boot', __FILE__)

require 'csv'
  • Tiếp theo file products_controller.rb ta thêm một khối respond_tonhư đoạn sau.
  def index
    @products = Product.all
    respond_to do |format|
      format.html
      format.csv {render text: @products.to_csv}
    end
  end
  • Trong models/product.rb method to_csv được mô tả:
  def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |product|
        csv << product.attributes.values_at(*column_names)
      end
    end
  end

Dòng đầu tiên của file sẽ là tên các trường của bảng Product. Các dòng tiếp theo là giá trị các trường tương ứng với dòng đầu của mỗi product trong database.

  • Trong View thêm dòng này để khi click vào sẽ xuất ra file products.csv
<%= link_to "CSV", products_path(format: "csv") %>

II. Export Excel

  • Thêm vào file /config/initializers/mime_types.rb như sau:
Mime::Type.register "application/xls", :xls
  • Thêm format: xls trong products_controller.rb
  def index
    @products = Product.all
    respond_to do |format|
      format.html
      format.xls { render text: @products.to_csv }
    end
  end
  • Trong models/product.rb method to_csv được mô tả tương tự như đối với file csv:
  def self.to_csv
    CSV.generate do |csv|
      csv << column_names
      all.each do |product|
        csv << product.attributes.values_at(*column_names)
      end
    end
  end
  • Và ta tượng trong view chúng ta thêm
<%= link_to "Excel", products_path(format: "xls") %>

Trên đây là cách đơn giản nhất để xuất dữ liệu ra file CSV/Excel mà mình đã được biết đến.

0