2010-10-18 11 views
7

Ho una funzione in un controller che accetta alcune specifiche e genera un rapporto su di esse. Questa funzione user_report viene chiamata in una vista:Difficoltà con send_data in Ruby on Rails in combinazione con il plug-in Spreadsheet

<% = submit_to_remote 'submit-button', "Esporta report in Excel",: url => {: controller =>: reports,: action =>: user_report,: print_state => 'print'}%>

In reports_controller uso il plug-in Spreadsheet per generare un file Excel all'interno della funzione user_report. Voglio usare send_data per inviare il file in streaming all'utente senza prima averlo creato sul server. La ricerca che ho fatto mostra che usare StringIO è la strada da percorrere, come mostrato di seguito. Frustrante, non succede nulla quando chiamo send_data. Il plugin sembra funzionare bene creando un file e salvandolo sul server, ma non fa nulla quando utilizzo send_file, suggerendo che il problema non risiede nel plugin. Ma allora cosa faccio di sbagliato con send_file/send_data?

La funzione stessa si presenta così:

def user_report

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 

fine

Il file di log si legge 2010-10-18 14:13 : 59 INFO - Invio dei dati Report_for_jjohnson.xls ma nessun download inizia nel browser. Sono riuscito a utilizzare send_data su questa app in precedenza, il che è fonte di confusione.

Utilizzo Rails v2.3, Ruby v1.8.7 e Spreadsheet v6.4.1 su spreadsheet.rubyforge.org.

risposta

6

basta cambiare la linea:

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

a:

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

Questa è una vecchia questione ... Ma ho una voglia di notare che 'data.string.force_encoding ('binario')' per me funziona e sembra un po 'meglio. – scaryzet

0

Anche se non mi piace scrivere e cancellare, ma con fogli di calcolo sembra che l'unica soluzione.


# 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")