【问题标题】:Exporting to CSV from complex rails query从复杂的 Rails 查询导出到 CSV
【发布时间】:2013-06-07 15:00:30
【问题描述】:

我一直在关注这个 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 -> 使用 Rails 最新版本

:: 编辑:: 每列一行是指仅在我的 Excel 工作表和这一行上的一行

A 列 = #<Product:0x00000004c83328>

B 列 = #<Product:0x00000004c83329>

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 =&gt; ",") 我想是可选的。

结果:

【问题讨论】:

    标签: ruby-on-rails csv fastercsv


    【解决方案1】:

    您可以使用这个 gem,您可以轻松导出任何复杂的查询。

    https://github.com/stevenbarragan/julia_builder

    【讨论】:

      【解决方案2】:

      好的,这就是我所做的。

      将响应者修改为这个...

      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 对象都是非常动态的。 现在必须这样做......

      【讨论】:

        【解决方案3】:

        您快到了,您只需要映射每个 Product 模型对象,因为您正在对它们调用 to_s,这是未定义的。

        因此,如果您只需要标题列表,则可以覆盖模型 (app/models/product.rb) 上的 to_s 方法以执行以下操作:

        def to_s
          title
        end
        

        或者,要生成一个逗号分隔的列表,您可以这样做

        def to_s
          [title, price, availability].join(',')
        end
        

        【讨论】:

        • 对不起,我不明白你说我打电话给to_s是什么意思...我只是打电话给paginate_by_sql。虽然我意识到输出看起来像是模型转换为字符串......这很奇怪。我一定很近……
        • 是的,如果您在模型上调用 to_s,例如 Person,您将获得类似 #&lt;Product:0x00000004c83329&gt; 的输出。这是 ActiveRecord 模型的默认字符串转换。所以,我建议你通过定义一个新的to_s 方法来覆盖你的模型中的这个方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 2017-12-29
        • 1970-01-01
        • 2017-02-27
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多