2010-10-29 13 views
22

Estoy usando esta joya Spreadsheet para exportar archivos xls.Descarga directa de un archivo xls sin escribirlo en el directorio por hoja de cálculo gema

que tienen los siguientes códigos en mi regulador:

def export 
    @data = Data.all 

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

    contruct_body(sheet, @data) 

    book.write "data.xls" 
end 

De esta manera, puedo rellenar los datos y guardarlo en el directorio raíz.

Pero quiero descargarlo en lugar de guardarlo. ¿Cómo podría modificar el código para que el usuario solicite que seleccione su directorio local para guardar el archivo? (mejor si sin guardar una copia en el lado del servidor)

Por favor ayuda!

Respuesta

46

Puede enviarlo al navegador sin guardarlo como un archivo local en absoluto de la siguiente manera

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

Realmente funciona bien. ¡Gracias! – PeterWong

+0

@DanSingerman ¿me pueden ayudar a hacer lo mismo con CSV? – RAJ

+0

@RAJ crear una nueva pregunta SO y voy a echar un vistazo – DanSingerman

2

Usted podría intentar este código

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

Pasando :stream => false a send_file instruirán a los carriles para copiar el archivo en la memoria antes de streaming, por lo que usar File.delete inmediatamente después send_file estaría bien ya send_file vuelve inmediatamente sin esperar a la descargar para completar. Habiendo dicho eso, con archivos muy grandes puede ver algunos cuellos de botella de memoria dependiendo de la cantidad de memoria disponible.

HTH

+0

Bravo! De hecho, acabo de enterarme de la misma manera por la tarde, pero esperando una nueva prueba. Tu respuesta me dio confianza así que creo que ya no tengo que preocuparte ^^ ¡Gracias! – PeterWong

+0

Me alegro de poder ayudar :) –

+0

Parece que ya no funciona (acabo de heredar una aplicación que usa esta solución ...). Si elimino la parte 'File.delete', esto funciona. Intenté eliminar el archivo en un filtro posterior, pero tampoco funciona. Según lo entiendo, 'stream: false' ya no es una opción para este método, y el archivo NO se almacenará en caché ... ¿Alguna idea? o debería usar send_data? –

0

El caso suceda en mybody. Utilicé la solicitud de ajax por remote :: true para exportar archivos de Excel, nada se muestra en el navegador sin ningún mensaje de error en la consola. Elimina los parámetros remotos del formulario, funciona bien.

Cuestiones relacionadas