2010-10-18 3 views
7

Ich habe eine Funktion in einem Controller, der einige Spezifikationen übernimmt und einen Bericht über sie generiert. Diese Funktion user_report wird in einer Sicht aufgerufen:Schwierigkeit mit send_data in Ruby on Rails in Verbindung mit Tabellenkalkulations-Plugin

<% = submit_to_remote 'Senden-Schaltfläche', "Bericht nach Excel exportieren",: url => {: controller =>: reports,: action =>: user_report,: print_state => 'print'}%>

In reports_controller verwende ich das Spreadsheet-Plugin, um eine Excel-Datei innerhalb der User_report-Funktion zu generieren. Ich möchte send_data verwenden, um die Datei an den Benutzer zu streamen, ohne sie zuerst auf dem Server zu erstellen. Die Recherche, die ich durchgeführt habe, zeigt, dass die Verwendung von StringIO der richtige Weg ist, wie unten gezeigt. Frustrierend passiert nichts, wenn ich send_data anrufe. Das Plugin scheint gut zu funktionieren, eine Datei zu erstellen und sie auf dem Server zu speichern, tut aber nichts, wenn ich send_file benutze, was darauf hindeutet, dass das Problem nicht im Plugin liegt. Aber was mache ich falsch mit send_file/send_data?

Die Funktion selbst sieht wie folgt aus:

def

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 

Ende

Die Log-Datei liest 2010-10-18 14.13 user_report : 59 INFO - Daten senden Report_for_jjohnson.xls , aber kein Download beginnt im Browser. Es ist mir gelungen, send_data für diese App vorher zu verwenden, was verwirrend ist.

Ich verwende Rails v2.3, Ruby v1.8.7, und Spreadsheet v6.4.1 bei Spreadsheet.rubyforge.org.

Antwort

6

Ändern Sie einfach die Zeile:

send_data data.string, :type=>"application/excel", :disposition=>'attachment', :filename => @outfile 

zu:

send_data data.string.bytes.to_a.pack("C*"), :type=>"application/excel", :disposition=>'attachment', :filename => @outfile 
+3

Dies ist eine alte Frage ... Aber ich habe den Drang, zu bemerken, dass 'data.string.force_encoding (‚binary‘)' funktioniert für mich und sieht ein bisschen besser. – scaryzet

0

Auch wenn ich schreiben mögen nicht und löschen, aber mit Tabelle scheint die einzige Lösung.


# write the file 

book.write "Employee_History_#{ params[:id]}.xls" 

# send the file 

send_file "Employee_History_#{ params[:id]}.xls", :type => "application/vnd.ms-excel", :filename => "data.xls", :stream => false 

# and then delete the file 

File.delete("Employee_History_#{ params[:id]}.xls")