我正在关注此railscast视频,但我在将数据导出为Excel时遇到严重困难(或者就此而言是CSV)。
我正在使用will_paginate在我在前端显示的一些数据中这样:
sql = "select complex..."
@data = paginate_by_sql([sql],
:per_page => params[:rows],
:page => params[:page])
因此,我认为这应该有效:
respond_to do |format|
format.html
format.xls { send_data @data.to_csv(:col_sep => "\t") }
end
并且它实际上正确地下载了一个xls文件,内容全部搞砸了,每列显示一行,内容如下:
#<Product:0x00000004c83328>
PS - &gt;使用rails最新版本
::编辑:: 每列一行我的意思是只在我的Excel工作表和这一行上的一行
COLUMN A = #<Product:0x00000004c83328>
COLUMN B = #<Product:0x00000004c83329>
COLUMN C = #<Product:0x00000004c8333>
(30列)
更新
进行了简单的测试练习,并且仅在一列中再次使用所有列:
csv_string = CSV.generate(:col_sep => ",") do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
end
respond_to do |format|
format.html
format.csv { send_data csv_string,
:type => 'text/csv; charset=iso-8859-1; header=present',
:disposition => "attachment; filename=records.csv" }
end
我认为 (:col_sep => ",")
是可选的。
结果:
答案 0 :(得分:0)
你几乎就在那里,你只需要映射每个Product
模型对象,因为你在它们上面调用to_s
,这是未定义的。
因此,如果您只想要一个标题列表,则可以覆盖模型上的to_s
方法(app/models/product.rb
),以执行以下操作:
def to_s
title
end
或者,要生成以逗号分隔的列表,您可以
def to_s
[title, price, availability].join(',')
end
答案 1 :(得分:0)
将响应者修改为此...
respond_to do |format|
format.xls
end
并使用此...
创建了一个名为nameofmethod.xls.erb的模板<?xml 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">
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<% @data.first.attributes.keys.each do |column| %>
<Cell><Data ss:Type="String"><%=column%></Data></Cell>
<% end %>
</Row>
<% @data.each do |row| %>
<Row>
<% row.attributes.values.each do |column| %>
<Cell><Data ss:Type="String"><%= column %></Data></Cell>
<% end %>
</Row>
<% end %>
</Table>
</Worksheet>
</Workbook>
对于任何类型的ActiveRecord对象,这都是非常动态的。 现在这将不得不......
答案 2 :(得分:0)
您可以使用此gem,您可以轻松导出任何复杂的查询。