2010-10-18 11 views
7

J'ai une fonction dans un contrôleur qui accepte certaines spécifications et génère un rapport sur celles-ci. Cette fonction user_report est appelée dans une vue:Difficulté avec send_data dans Ruby on Rails en conjonction avec le plug-in Spreadsheet

<% = submit_to_remote 'submit-button', "Exporter le rapport vers Excel",: url => {: controller =>: reports,: action =>: user_report,: print_state => 'print'}%>

Dans reports_controller, j'utilise le plugin Spreadsheet pour générer un fichier Excel dans la fonction user_report. Je veux utiliser send_data pour diffuser le fichier à l'utilisateur sans le créer d'abord sur le serveur. La recherche que j'ai faite montre que l'utilisation de StringIO est la voie à suivre, comme indiqué ci-dessous. Frustrant, rien ne se passe quand j'appelle send_data. Le plugin semble bien fonctionner en créant un fichier et en le sauvegardant sur le serveur, mais ne fait rien quand j'utilise send_file, suggérant que le problème ne réside pas dans le plugin. Mais alors, qu'est-ce que je fais de mal avec send_file/send_data?

La fonction elle-même ressemble à ceci:

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 

fin

Le fichier journal lit 2010-10-18 14:13 : 59 INFO - Envoi de données Report_for_jjohnson.xls mais aucun téléchargement ne commence dans le navigateur. J'ai réussi à utiliser send_data sur cette application avant, ce qui est source de confusion. J'utilise Rails v2.3, Ruby v1.8.7 et Spreadsheet v6.4.1 sur spreadsheet.rubyforge.org.

Répondre

6

il suffit de changer la ligne:

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

à:

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

Ceci est une vieille question ... Mais j'ai une envie de remarquer que 'data.string.force_encoding (« binaire »)' travaille pour moi et regarde un peu mieux. – scaryzet

0

Même si je n'aime écrire et supprimer, mais avec une feuille de calcul semble être la seule solution.


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