2

安装 gem 后,acts_as_xlsx我看不到如何在活动记录中返回相关字段。

class Ticket < ActiveRecord::Base
  acts_as_xlsx  :columns => [:customer_name ]
  attr_accessible :customer_id, :account_id, :first_weight, :ticket_no, :second_weight, :net_weight, :product_id, :vehicle_id, :customer_name, :vehicle_reg, :product_details, :weight


  belongs_to :customer
  belongs_to :vehicle
  belongs_to :product
  belongs_to :account

当通过tickets.xlsr 生成文件时,我得到cutomer_id 的结果,即30 不是客户名称我如何返回名称?

控制器

def report
    @q = @gaurd.ticket.where("net_weight > 0").paginate(:page => params[:page], :per_page => 10).search(params[:q])
    @ticket = @q.result(distinct: true)
    respond_to do |format|
      format.html
      format.xlsx {
      xlsx_package = @ticket.to_xlsx
      begin 
        temp = Tempfile.new("report.xlsx") 
        xlsx_package.serialize temp.path
        send_data xlsx_package.to_stream.read, :filename => 'tickets.xlsx', :type=> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        ensure
        temp.close 
        temp.unlink
      end
      }
    end
  end

我花了一天的大部分时间来尝试,但除了诸如 customer_id 之类的字段数据之外,无法下载相关的数据ticket.customer.name

4

2 回答 2

1

我发现显示其他表中的字段的技巧是指定列,然后为您使用的列名:'external_table:field_name',例如:

send_data xlsx_package.to_stream.read, :filename => 'tickets.xlsx', 
  :type => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  :columns => [:id, :'customer.name', :account_id]

如果客户只是有时可用,则报告将失败。此问题的替代方法是创建一个引用 customer.name 的方法,并在客户关系不存在的情况下返回诸如“No customer”之类的值。

或者,您可以动态生成 xlsx 文件并指定其他逻辑。有关详细信息,请参阅文档。

于 2014-02-19T15:38:17.823 回答
-1

这是导出 XLS 的出色 railscasts http://railscasts.com/episodes/362-exporting-csv-and-excel

该怎么办。在 config/application.rb

require 'csv'

在视图中

<%= link_to "Excel", model_path(format: "xls") %>

模型控制器.rb

def index
  @products = Product.order(:name)
  respond_to do |format|
    format.html
    format.csv { send_data @products.to_csv }
    format.xls # { send_data @products.to_csv(col_sep: "\t") }
  end
end

模型/模型.rb

def self.to_csv(options = {})
  CSV.generate(options) do |csv|
    csv << column_names
    all.each do |product|
      csv << model.attributes.values_at(*column_names)
    end
  end
end

这真的很重要

配置/初始化程序/mime_types.rb

Mime::Type.register "application/xls", :xls

视图/模型/index.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>
        <Cell><Data ss:Type="String">ID</Data></Cell>
        <Cell><Data ss:Type="String">Name</Data></Cell>
        <Cell><Data ss:Type="String">Release Date</Data></Cell>
        <Cell><Data ss:Type="String">Price</Data></Cell>
      </Row>
    <% @models.each do |model| %>
      <Row>
        <Cell><Data ss:Type="Number"><%= model.id %></Data></Cell>
        <Cell><Data ss:Type="String"><%= model.name %></Data></Cell>
        <Cell><Data ss:Type="String"><%= model.released_on %></Data></Cell>
        <Cell><Data ss:Type="Number"><%= model.price %></Data></Cell>
      </Row>
    <% end %>
    </Table>
  </Worksheet>
</Workbook>

有了这个,你应该没有问题导出到 XLS 文件

于 2013-09-27T19:38:36.887 回答