如何使用axlsx gem下载多个.xlsx文件?

时间:2014-08-27 03:20:57

标签: download axlsx

您好我在使用axlsx下载多个文件时遇到问题。问题是我向控制器发送了一组Id,并要求它使用render命令下载报告。它引发了一个AbstractController :: DoubleRenderError。我想要克服错误,但意识到这是一个坏主意,我不知道还能做什么...有什么建议吗?感谢。

我的控制器代码如下所示:

  def download_report
    params[:user_id].each do |user_id|
      @report = Report.find_by(:user_id => user_id)
      render :xlsx => "download_report", :filename => "#{@report.user.last_name}.xlsx"
    end
  end

我的axlsx模板:

  wb = xlsx_package.workbook
  wb.add_worksheet(name: "Reports") do |sheet|
    wb.styles do |s|
      # template code
    end
  end

1 个答案:

答案 0 :(得分:0)

这是Rails的内置期望,你可以根据请求调用一次渲染。并且,浏览器预计每个请求会有一个响应。所以,你将不得不做别的事情!

您可以使用render_to_string,并将结果合并到一个zip文件中。请参阅此回复的底部。

或者,您可以创建一个电子表格,并让每个用户的报告显示在他们自己的工作表上。

或者,在客户端,您可以使用javascript来请求每个电子表格并单独下载每个电子表格。

zip就像这段代码一样,它使用render_to_stringrubyzipsend_data

def download_report
  compressed_filestream = Zip::ZipOutputStream.write_buffer do |zos|
    params[:user_id].each do |user_id|
      @report = Report.find_by(:user_id => user_id)
      content = render_to_string :xlsx => "download_report", :filename => "#{@report.user.last_name}.xlsx"
      zos.put_next_entry("user_#{user_id}.xlsx")
      zos.print content
    end
  end
  compressed_filestream.rewind
  send_data compressed_filestream.read, :filename => 'download_report.zip', :type => "application/zip"
end

Axlsx需要rubyzip,所以你应该已经拥有它。您可能希望查找每个用户并使用他们的名称作为电子表格,除非您另有说明。