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ự ...
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.serialize và send_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 Autoawidth", "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)