直接下载xls文件而不通过Spreadsheet gem将其写入目录

时间:2010-10-29 07:39:32

标签: ruby-on-rails ruby-on-rails-3 export-to-excel xls

我正在使用此Spreadsheet gem来导出xls文件。

我的控制器中有以下代码:

def export
  @data = Data.all

  book = Spreadsheet::Workbook.new
  sheet = book.create_worksheet :name => "data"

  contruct_body(sheet, @data)

  book.write "data.xls"
end

通过这种方式,我可以填写数据并将其保存在根目录中。

但我想下载它而不是保存它。我怎么能修改代码,以便用户提示选择他的本地目录来保存文件? (如果不在服务器端保存副本,则更好)

请帮忙!

4 个答案:

答案 0 :(得分:50)

您可以将其发送到浏览器,而不必将其保存为本地文件,如下所示

spreadsheet = StringIO.new 
book.write spreadsheet 
send_data spreadsheet.string, :filename => "yourfile.xls", :type =>  "application/vnd.ms-excel"

答案 1 :(得分:2)

你可以试试这段代码

book.write "data.xls"

send_file "/path/to/data.xls", :type => "application/vnd.ms-excel", :filename => "data.xls", :stream => false

# and then delete the file

File.delete("path/to/data.xls")

:stream => false传递给send_file会指示Rails在传输之前将整个文件复制到内存中,因此File.delete之后立即使用send_file就可以了send_file }立即返回,而不等待下载完成。话虽如此,对于非常大的文件,您可能会看到一些内存瓶颈,具体取决于可用内存量。

HTH

答案 2 :(得分:0)

案件发生在我身上。 我使用remote :: true的ajax请求导出excel文件,浏览器上没有任何显示,控制台上没有任何错误消息。 从表单中删除远程参数,效果很好。

答案 3 :(得分:0)

我知道这太疯狂了,但我一直在寻找,所以可能有人会这样。

这就是答案。 (我正在使用Sinatra。)

https://github.com/zdavatz/spreadsheet/issues/125#issuecomment-370157753