gem "axlsx_rails"
Bài đăng này đã không được cập nhật trong 8 năm
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 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