2014-01-27 4 views
13

Hat jemand versucht, mit dem Download-Handler in R Shiny eine frisch erstellte Excel-Datei mit XLConnect herunterzuladen?Excel-Datei von XLConnect mit R Shiny herunterladen

Im ui.R gibt es die unauffällige Linie:

output$downloadData <- downloadHandler(

filename = function() { "output.xlsx" }, 

    content = function(file){ 
     wb <- loadWorkbook(file, create = TRUE) 
     createSheet(wb, name = "Sheet1") 
     writeWorksheet(wb, c(1:3), sheet = "Sheet1") # writes numbers 1:3 in file 
     saveWorkbook(wb) 
    } 
) 

Ich habe kein Problem

eine CSV und keine Probleme beim Herunterladen:

downloadButton('downloadData', 'Download') 

Im server.R gibt den Handler Erstellen der Excel-Datei mit XLConnect. Aber wenn ich den Code ausführen, wie oben bekomme ich folgende Fehler in meinem Browser Chrome:

Illegal (Java): Dateierweiterung „file1b683b9323bc“ nicht unterstützt! Nur * .xls und * .xlsx sind erlaubt!

Soweit ich sehen kann, kann XLConnect nicht in eine temporäre Datei schreiben.

Hat jemand eine Lösung oder Workaround?

Eine Option wäre, die Datei an einem bestimmten Speicherort zu speichern und dann einen Download-Link zu erstellen, der darauf verweist. Dies ist jedoch nicht sehr Shiny-esque, da mehrere Benutzer Havok verursachen würden.

Vielen Dank

Marcus

Antwort

12

Versuchen Sie, diese für die content(...)-Funktion; es funktioniert für mich ...

content = function(file){ 
     fname <- paste(file,"xlsx",sep=".") 
     wb <- loadWorkbook(fname, create = TRUE) 
     createSheet(wb, name = "Sheet1") 
     writeWorksheet(wb, c(1:3), sheet = "Sheet1") # writes numbers 1:3 in file 
     saveWorkbook(wb) 
     file.rename(fname,file) 
    } 

Das Problem ist, dass file eine temporäre Datei zufällig generiert wird, ohne eine Erweiterung, während saveWorkbook(...) die .xlsx Erweiterung erfordert. Das fügt also .xlsx an file an und verwendet das für alle XLConnect-Manipulationen, benennt dann die endgültige Datei in dem ursprünglichen Name um (z. B. entfernt die Erweiterung).

+0

Das macht so viel Sinn, und es funktioniert! Vielen Dank. – steinbock