从复杂的rails导出到CSV查询

时间:2013-06-11 16:50:39

标签: ruby-on-rails csv fastercsv

我正在关注此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 => ",")是可选的。

结果:

excel output

3 个答案:

答案 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,您可以轻松导出任何复杂的查询。

https://github.com/stevenbarragan/julia_builder