0

我需要将我的模型导出到 .xlsx 并为 axlsx 模板提交一些参数(复选框)。

我有一个控制器“leads”和自定义发布操作“export”,它应该调用我的 export.xlsx.axlsx 模板:

def export
  respond_to do |format|
      format.xlsx ## here is invoking my export.xlsx.axlsx
  end
end

在我的 routes.rb 我有以下内容:

resources :leads do
  collection { post :ipmort }
end

我正在尝试实现以下视图:

<%= form_tag export_leads_path do %> 
  <%= button_to "Export to Excel", {controller: 'leads', action: "export", 
      remote: true, form: { "data-type" => "xlsx" }} %>
<% end %>

但是当我点击这个按钮时,我得到了 html 数据格式,但没有 xlsx在此处输入图像描述

是否有可能在 submit_tag、button_to 中指定 respond_to 格式?

我曾尝试使用 <%= link_to %> 但我无法获得我的表单参数..

<%= form_tag export_leads_path do %> 
  <%= link_to "Excel", export_leads_path(format: "xlsx", commit: "Excel"), method: :post %>
<% end %>

这里我没有lead_ids 参数:

在此处输入图像描述

我也尝试过 <% submit_tag %>,但结果与 <%= button_to %> 相同

请帮助我,我整天都在为这个问题苦苦挣扎,不知道我还能做什么。如果您需要任何其他信息,请告诉我,我会尽快提供!

提前致谢!

4

2 回答 2

1

使用格式:“xls”

此外,您可以创建 export.xls.erb。示例如下:

<% @headers = ["Id","Name","Email","Grade","Groups","% Total Playlist Videos Watched"] %>
<?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="Users">
    <Table>
      <Row>
        <% @headers.each do |column| %>
          <Cell><Data ss:Type="String"><%=column%></Data></Cell>
        <% end %>
      </Row>
      <% @users.each do |user| %>
        <Row>
            <Cell><Data ss:Type="Number"><%= user.id %></Data></Cell>
            <Cell><Data ss:Type="String"><%= user.name %></Data></Cell>
            <Cell><Data ss:Type="String"><%= user.email %></Data></Cell>
            <Cell><Data ss:Type="Number"><%= user.grade %></Data></Cell>
            <Cell><Data ss:Type="String"><%= user.group_name %></Data></Cell>
            <Cell><Data ss:Type="Number"><%= user.videos_seen %></Data></Cell>
        </Row>
      <% end %>
    </Table>
  </Worksheet>
</Workbook>

我希望它有所帮助。

于 2013-12-04T16:25:57.433 回答
1

我找到了解决方案,这是我的提示。希望它对面临同样问题的人有所帮助。

1) 路线:

resources :leads do
  collection { post :export }
end

2)控制器动作:

 def export
    case params[:commit]
      when "To Excel" then render xlsx: 'export'
      when "To CSV" then send_data @leads.to_csv_modified(@lead_ids), filename: 'export.csv'
      else render action: "index"
    end
  end

3)查看:

  <%= form_tag export_leads_path, method: :post do %>
    <%= text_field_tag :created_at_first %>
    <%= text_field_tag :created_at_last%>

    <% Lead.new.attributes.keys[0...Lead.new.attributes.keys.length-1].each_with_index do |field, index| %>
      <%= check_box_tag "lead_ids[]", field, checked = true %>
      <%= field %>
    <% end %>

    <%= submit_tag 'To Excel', controller: 'leads', action: "export" %>
    <%= submit_tag 'To CSV', controller: 'leads', action: "export" %>
  <% end %>

4) Axlsx 模板(在控制器中调用 render xlsx: 'export'):

$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"

require 'axlsx'

p = Axlsx::Package.new
wb = xlsx_package.workbook
 style_shout = wb.styles.add_style sz: 16, b: true, alignment: { horizontal: :center }
 wb.add_worksheet(name: "#{Time.now.to_date}") do |sheet|
   sheet.add_row params[:lead_ids]
   @leads.each_with_index do |lead, index|
     sheet.add_row params[:lead_ids].map {|e| lead.send(e) }
   end
 end

5) 方法 to_csv_modified(在控制器中调用 send_data @leads.to_csv_modified(@lead_ids),文件名:'import.csv'):

def self.to_csv_modified(lead_ids, options = {})
    CSV.generate(options) do |csv|
      csv << lead_ids
      all.each do |lead|
    csv << lead.attributes.values_at(*lead_ids)
      end
    end
end

如果你想看看它是如何工作的,请访问我的 github conditional_exporting_to_XLSX_with_params

另一个有用的链接:Axlsx_documentationRailscast #396 - importing csv-and-excelRailscast #362 - exporting csv-and-excel

于 2013-12-05T09:39:36.013 回答