我在控制器中有一个函数,它接受一些规范并生成关于它们的报告。此函数 user_report 在视图中调用:
< %= submit_to_remote 'submit-button', "Export Report to Excel", :url => { :controller => :reports, :action => :user_report, :print_state => 'print'} % >
在报告控制器中,我使用电子表格插件在 user_report 函数中生成 Excel 文件。我想使用 send_data 将文件流式传输给用户,而无需先在服务器上创建它。我所做的研究表明,使用 StringIO 是可行的方法,如下所示。令人沮丧的是,当我调用 send_data 时没有任何反应。该插件似乎可以很好地创建文件并将其保存在服务器上,但是当我使用 send_file 时什么也没做,这表明问题不在于插件。但是,我在 send_file/send_data 上做错了什么?
函数本身如下所示:
定义用户报告
if request.post?
unless params[:reports][:userid].blank?
@userid=params[:reports][:userid]
end
if params[:print_state]=='print'
report = Spreadsheet::Workbook.new
info = report.create_worksheet :name => 'User Information'
info.row(1).push 'User ID', @userid
@outfile = "Report_for_#{@userid}.xls"
require 'stringio'
data = StringIO.new ''
report.write data
send_data data.string, :type=>"application/excel", :disposition=>'attachment', :filename => @outfile
end
respond_to do |format|
format.js { }
end
end
结尾
日志文件读取 2010-10-18 14:13:59 INFO -- 发送数据 Report_for_jjohnson.xls 但浏览器中没有开始下载。我之前已经成功地在这个应用程序上使用了 send_data,这令人困惑。
我在电子表格.rubyforge.org 上使用 Rails v2.3、Ruby v1.8.7 和电子表格 v6.4.1。