虽然下载文件有 Rails
默认的 send_data
和 send_file
方法,还有像 axlsx_rails 这样的第三方库。但是我仍然比较倾向于使用 Spreedsheet XML
的方式去开发下载文件的功能。
配置 config/initializers/mime_types.rb
文件,使 Rails 能够支持导出文件的后缀名。
1 2 Mime::Type.register "application/csv" , :csv Mime::Type.register "application/xls" , :xls
建立 download
方法,并配置好路由。
1 2 3 4 5 6 7 8 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
1 2 3 4 5 6 7 8 9 10 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
文件,编写表格内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <?x ml version="1.0" ?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns: o="urn:schemas-microsoft-com:office:office" xmlns: x="urn:schemas-microsoft-com:office:excel" xmlns: ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns: html="http://www.w3.org/TR/REC-html40" > <Styles> <Style ss: ID ="s62" > <NumberFormat ss: Format=""¥"#,##0.00" /> </Style> </ Styles> <Worksheet ss: Name="订单报表" > <Table> <Row> <Cell><Data ss: Type="String" >订单名称</Data></ Cell> <Cell><Data ss: Type="String" >订单数量</Data></ Cell> <Cell><Data ss: Type="String" >订单金额</Data></ Cell> <Cell><Data ss: Type="String" >购买用户</Data></ Cell> <Cell><Data ss: Type="String" >联系电话</Data></ Cell> <Cell><Data ss: Type="String" >订单创建时间</Data></ Cell> </Row> <% @orders.each do |order| %> <Row> <Cell><Data ss:Type="String"><%= order.name %></ Data></Cell> <Cell><Data ss:Type="Number"><%= order.count %></ Data></Cell> <Cell ss:StyleID="s62"><Data ss:Type="Number"><%= order.amount %></ Data></Cell> <Cell><Data ss:Type="String"><%= order.user.nickname %></ Data></Cell> <Cell><Data ss:Type="String"><%= order.user.mobile %></ Data></Cell> <Cell><Data ss:Type="String"><%= order.created_at.strftime('%Y-%m-%d %H:%M:%S') %></ Data></Cell> </ Row> <% end %> </Table> </ Worksheet></Workbook>
现在启动你的 Rails
应用,访问 http://localhost:3000/orders/download.xls 就可以导出订单报表。访问 http://localhost:3000/orders/download.csv 可以导出 CSV 文件。
参考文档