2013-03-14 19 views
7

Sto usando axlsx gem per creare file excel. Li ho serializzati nella directory home del mio progetto come un file xlsx. Ma voglio che il file venga creato nella cartella pubblica della mia app per le rotaie, o direttamente scaricabile dall'utente senza salvarlo nel server. Come posso fare questo?? Ecco il controller che genera il file xlsxesportazione nella cartella pubblica usando axlsx

def export_excel 
    p = Axlsx::Package.new 
    wb = p.workbook 
    wb.add_worksheet(:name => "Basic Worksheet") do |sheet| 
    (1..10).each { |label| sheet.add_row [label, rand(24)+1] } 
    sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A14", :end_at => "F24") do |chart| 
     chart.add_series :data => sheet["B1:B10"], :labels => sheet["A1:A10"], :title => sheet["A1"] 
    end 
    end 
    p.serialize('charts.xlsx')  

end 
+3

È così semplice. Dì solo p.serialize ('public/charts.xlsx') – mukesh

risposta

5
p = Axlsx::Package.new 
# ... 
outstrio = StringIO.new 
p.use_shared_strings = true # Otherwise strings don't display in iWork Numbers 
outstrio.write(p.to_stream.read) 
outstrio.string 

Questo produrrà il contenuto del file del file xls. Quindi puoi o send_data per l'utente, o salvarlo su un file su disco.

+0

thx @fearpi. funziona – mukesh

+2

questo è quello che ho fatto: 'outstrio = StringIO.new \t p.use_shared_strings = true \t outstrio.write (p.to_stream.read) \t Send_Data outstrio.string,: nomefile => "report.xlsx" '' – mukesh

+0

fearpi è corretto. Grazie! Oltre a @mukesh per scrivere un file in un disco. file = File.open ("# {Rails.root} /tmp/temp.csv", 'w') file.write outstrio.string –

0

Risposta tardiva: è possibile utilizzare anche la gemma axlsx_rails. Si aggiunge un gestore di template per axlsx, il che rende molto facile da generare e servire file XLSX:

https://github.com/straydogstudio/axlsx_rails

Esso consente di mettere tutto il codice axlsx in vista, con parziali. Se stai facendo un sacco di xlsx nei binari, è comodo.

Naturalmente, anche serialize funziona bene o per lo streaming come @fearpi menzionato.

Problemi correlati