3

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

结果:

excel输出

4

3 回答 3

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 对象来说都是非常动态的。现在这将不得不做......

于 2013-06-17T11:44:16.660 回答
0

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

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

def to_s
  title
end

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

def to_s
  [title, price, availability].join(',')
end
于 2013-06-11T19:40:42.110 回答
0

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

https://github.com/stevenbarragan/julia_builder

于 2015-10-29T10:59:26.587 回答