2010-10-29 18 views
22

Ben xls dosyasını vermek için bu Spreadsheet taş kullanıyorum. Bu şekildeDoğrudan bir xls dosyası Spreadsheet gem tarafından dizine yazmadan indirme

def export 
    @data = Data.all 

    book = Spreadsheet::Workbook.new 
    sheet = book.create_worksheet :name => "data" 

    contruct_body(sheet, @data) 

    book.write "data.xls" 
end 

, ben veri doldurup kök dizininde kaydedebilirsiniz:

benim denetleyicisi aşağıdaki kodları var.

Ancak onu kaydetmek yerine indirmek istiyorum. Kodu nasıl değiştirebilirim, böylece kullanıcı dosyayı kaydetmek için kendi yerel dizinini seçmeye çalıştı? (sunucu tarafında bir kopya kaydetmeden daha iyi olursa)

Lütfen yardım edin!

cevap

46

spreadsheet = StringIO.new 
book.write spreadsheet 
send_data spreadsheet.string, :filename => "yourfile.xls", :type => "application/vnd.ms-excel" 
+0

Gerçekten iyi çalışıyor. Teşekkürler! – PeterWong

+0

@DanSingerman csv ile aynı şeyi yapmama yardım edebilir misin? – RAJ

+0

@RAJ yeni bir SO sorusu oluşturun ve ben bir göz atacağım – DanSingerman

2

hemen beklemeden böylece send_file getiri beri iyi olurdu send_file hemen sonra File.delete kullanarak, bu kodu

book.write "data.xls" 

send_file "/path/to/data.xls", :type => "application/vnd.ms-excel", :filename => "data.xls", :stream => false 

# and then delete the file 

File.delete("path/to/data.xls") 

:stream => falsesend_file akarsu önce belleğe dosyanın tamamını kopyalamak için Rails talimat verir Geçme deneyebilirsiniz tamamlamak için indirin. Bunu söyledikten sonra, çok büyük dosyalarda mevcut bellek miktarına bağlı olarak bazı bellek şişe boyunları görebilirsiniz.

HTH

+0

Bravo! Aslında, öğleden sonraları aynı şeyi öğrendim ama daha fazla test için bekliyordum. Cevabınız bana güven verdi, bu yüzden artık endişelenmenize gerek yok düşünüyorum ^^ Teşekkürler! – PeterWong

+0

Sevindim Yardımcı olabilirim :) –

+0

Bu artık işe yaramıyor gibi görünüyor (Bu çözümü kullanan bir uygulamayı miras aldım ...). 'File.delete' bölümünü kaldırırsam, bu çalışır. Bir filtreden sonra dosyayı silmeyi denedim, ancak bu da çalışmıyor. Anladığım kadarıyla, 'stream: false' bu yöntem için artık bir seçenek değildir ve dosya önbelleğe alınmayacaktır ... Herhangi bir öngörü? veya send_data kullanmalı mıyım? –

0

vaka mybody üzerinde gerçekleşmesi aşağıdaki gibi hiç yerel bir dosya olarak kaydetmeden tarayıcıya gönderebilirsiniz. excel dosyasını vermek için remote :: true ile ajax isteğini kullandım, konsolda hiçbir hata mesajı olmadan tarayıcıda hiçbir şey görüntülenmiyor. Uzak paramları formdan sil, iyi çalışıyor.

İlgili konular