Загрузка файла Excel из XLConnect с R Shiny

Кто-нибудь пытался использовать обработчик загрузки в R Shiny для загрузки только что созданного файла Excel с помощью XLConnect?

В ui.R есть ничем не примечательная строка:

downloadButton('downloadData', 'Download')

В сервере .R есть обработчик:

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

У меня нет проблем с загрузкой CSV и без проблем с созданием файла excel с помощью XLConnect. Но когда я запускаю код, как указано выше, я получаю следующую ошибку в браузере Chrome:

IllegalArgumentException (Java): расширение файла "file1b683b9323bc" не поддерживается! Разрешены только *.xls и *.xlsx!

Насколько я вижу, XLConnect не может записать во временный файл.

Кто-нибудь получил решение или обход?

Один из вариантов - сохранить файл в определенном месте, а затем создать ссылку для загрузки, указывающую на него. Тем не менее, это не очень Shiny-esque, поскольку многие пользователи могут вызвать хавок.

Большое спасибо

Марк

Ответы

Ответ 1

Попробуйте использовать это для функции content(...); он работает для меня...

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

Проблема заключается в том, что file является произвольно созданным временным файлом без расширения, тогда как saveWorkbook(...) требует расширения .xlsx. Таким образом, это просто добавляет .xlsx в file и использует это для всех манипуляций XLConnect, а затем переименовывает окончательный файл в исходное имя (например, удаляет расширение).