+1

gem "axlsx_rails"

bạn đang tìm hiểu muốn làm việc với file excel như thế nào. Hôm nay mình xin giới thiệu "gem axlsx" giúp bạn xuất file excel một cách đơn giản. Với AXLSX giúp chúng ta tạo ra các file excel với các bảng, biểu đồ, hình ảnh (với liên kết). Cũng có thể tùy chỉnh độ rộng của các cột cố định cũng như tự động. Các chức năng, sắp xếp các thuộc tính tùy theo ý thích. Hay nhất là chúng ta có thể xem file xlsx trước khi serialization trước khi gửi file đó cho khác hàng. (hihi) Sau đây là hướng dẫn cơ bản việc sử dụng axlsx-rails để bạn export file excel

Để bắt đầu chúng ta add gem "axlsx-rails" để có thể chạy được gem "axlsx-rails" phải add thêm gem "zip-zip"

Controller

Mình sẽ xuất ra file product.xlsx với toàn bộ thông tin các bản ghi sản phẩm.

@products = Product.all
product = Product.create_axlsx @products
export_to_xlsx product, "product.xlsx"

Viết một hàm export_to_xlsx để conver giá trị truyền vào và các giá trị sẽ được lưu vào server bằng

file.serializesend_data sẽ giúp truyền toàn bộ dữ liệu vào file xlsx.


def export_to_xlsx file, file_name
    tempfile = "#{Rails.root}/tmp/tempfile.xlsx"

    file.serialize tempfile
    File.open tempfile, "r" do |f|
      send_data f.read, filename: file_name, type: "application/xlsx"
    end
    File.delete tempfile
  end

Model

Trong model mình sẽ viết hàm create_axlsx mà ở trong controller đã gọi. Tạo 1 template với .xlsx.axlsx kế thừa (action_name.xlsx.axlsx) với việc sử dụng xlsx_package để tạo ra các sheet


  def self.create_axlsx product
    p = Axlsx::Package.new
    wb = p.workbook

    wb.add_worksheet do |sheet|
      sheet.add_row ["Name", "Quality", "Price", "Comment"]
      product.each do |product|
        sheet.add_row [product.name, product.quality,
          product.price, product.comment]
      end
    end
    p
  end

Như vậy là chúng ta đã export 1 file excel cơ bản và đơn giản với gem axlsx-rails Chúng ta cũng có thể custom-style, wrap-text, cell_style_override...

ví dụ như mình sẽ xét mầu, border cho row


 wb.styles do |s|
    black_cell = s.add_style bg_color: "00", fg_color: "FF",
    sz: 14, alignment: { horizontal: :center }
    blue_cell =  s.add_style  bg_color: "0000FF",
    fg_color: "FF", sz: 20, :alignment: { horizontal: :center }
    wb.add_worksheet(name: "Custom Styles") do |sheet|
      sheet.add_row ["Text Autowidth", "Second", "Third"],
        style: [black_cell, blue_cell, black_cell]
      sheet.add_row [1, 2, 3], :style => Axlsx::STYLE_THIN_BORDER
    end
  end

Các bạn có thể tham khảo tại https://github.com/randym/axlsx/blob/master/examples/example.rb để tìm hiểu sau hơn về custom file xlsx

** Rendering Options**

Bạn có thể gọi các render trong các trường hợp sau:


# rendered, no disposition/filename header

    render 'buttons'

# rendered from another controller, no disposition/filename header

    render 'featured/latest'

# template and filename of 'buttons'

    render xlsx: 'buttons'

# template from another controller, filename of 'latest_buttons'

    render xlsx: 'latest_buttons', template: 'featured/latest'

** File Name **

Bạn phải đặt tên file : filename: filename.xlsx, type: "application/xlsx"

** Template **

Sử dụng .xlsx.axlsx, trong template sử dụng biến xlsx_package được thiết lập với Axlsx::Package.new:


wb = xlsx_package.workbook
style_shout = wb.styles.add_style sz: 16, b: true,
  alignment: { horizontal: :center }
wb.add_worksheet(name: "Foobar") do |sheet|
  sheet.add_row ['Bad', 'spellers', 'of', 'the', 'world', '...']
  sheet.add_row ['Untie!']
  sheet.merge_cells("B1:B6")
  sheet["B1"].style = style_shout
end

** Acts As Xlsx **

Bạn cũng có thể sử dụng acts_as_xlsx thay vì sử dụng xlsx_package để taọ ra các spreadsheet.


 User.to_xlsx package: xlsx_package, (other options)

Các bạn có thể tham khảo chi tiết tại https://github.com/randym/acts_as_xlsx

** Axlsx Package **

Axlsx package cung cấp cho bạn 3 lựa chọn để bạn khởi tạo 1 bảng: :xlsx_author (String) : Tác giả của file :xlsx_created_at (Time) : Xét thời gian tạo file (mặc định là thời gian hiện tại) :xlsx_use_shared_strings (Boolean) : Sẽ giúp cho các chuỗi dùng chung các gói package được sử dụng 1 các tuần tự

Mình sẽ sử dụng chúng bằng render :xlsx hoặc thêm biến local để gọi ví dụ:


render xlsx: "index", xlsx_author: "Elmer Fudd"
render "index", locals: {xlsx_author: "Elmer Fudd"}

Hoặc


render xlsx: "index", xlsx_created_at: 3.days.ago
render "index", locals: {xlsx_use_shared_strings: true}

** Mailers **

Bạn có thể sử dụng template xlsx để gửi mail có file xlsx đính kèm


class UserMailer < ActionMailer::Base
  def export(users)
    xlsx = render_to_string handlers: [:axlsx], formats: [:xlsx],
    template: "users/export", locals: {users: users}
    attachments["Users.xlsx"] = {mime_type: Mime::XLSX, content: xlsx}
    ...
  end
end

Vậy là mình đã giới thiệu xong gem axlsx-rails và cách sử dụng nó 1 cách đơn giản nhất

Cảm ơn các bạn đã theo dõi (bow)


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í