虽然下载文件有 Rails
默认的 send_data
和 send_file
方法,还有像 axlsx_rails 这样的第三方库。但是我仍然比较倾向于使用 Spreedsheet XML
的方式去开发下载文件的功能。
配置 config/initializers/mime_types.rb
文件,使 Rails 能够支持导出文件的后缀名。
Mime::Type.register "application/csv", :csv
Mime::Type.register "application/xls", :xls
建立 download
方法,并配置好路由。
# app/controllers/orders_controller.rb
def download
@orders = Order.where(created_at: '2019-01-01'.to_time..'2019-02-01'.to_time)
respond_to do |format|
format.csv { send_data @orders.to_csv }
format.xls { headers["Content-Disposition"] = 'attachment; filename=orders.xls' }
end
end
# app/models/order.rb
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv.tap do |csv_element|
all.each do |order|
csv_element << order.attributes.values_at(*column_names)
end
end
end
end
创建 app/views/orders/download.xls.erb
文件,编写表格内容。
订单名称 |
订单数量 |
订单金额 |
购买用户 |
联系电话 |
订单创建时间 |
<% @orders.each do |order| %>
<%= order.name %> |
<%= order.count %> |
<%= order.amount %> |
<%= order.user.nickname %> |
<%= order.user.mobile %> |
<%= order.created_at.strftime('%Y-%m-%d %H:%M:%S') %> |
<% end %>
现在启动你的 Rails
应用,访问 http://localhost:3000/orders/download.xls 就可以导出订单报表。访问 http://localhost:3000/orders/download.csv 可以导出 CSV 文件。
参考文档
- Rails Guides
- http://railscasts.com/episodes/362-exporting-csv-and-excel