Загрузите файл xls с несколькими листами в виде фреймов данных Shiny R

Я использую пакет R Shiny для разработки собственного веб-приложения.

У меня есть кнопка загрузки, которая позволяет мне экспортировать данные в файл Excel. В файле excel 4 листа и в каждом из них есть фрейм данных.

Например, в Sheet1 есть dataTab1, в sheet2 есть dataTab2, в листе 3 есть dataTab3, а в sheet4 есть dataTab4.

Для этого я использую функцию downloadHeader () в shiny server.R.

Для этого я использовал два метода.

Метод 1: использование пакета R xlsx

output$downloadTab <- downloadHandler(

  filename = "dataxls.xlsx",
  content = function(file) {

  #creation of the workbook
   dataxls=createWorkbook(file)
  #creation of the sheets
   dataTabs1=createSheet(wb=dataxls,sheetName="Compartiments-simulation_sans_changement") 
   dataTabs2=createSheet(wb=dataxls,sheetName="Esperance-simulation_sans_changement")         
   dataTabs3=createSheet(wb=dataxls,sheetName="Compartiments-simulation_avec_changement") 
   dataTabs4=createSheet(wb=dataxls,sheetName="Esperance-simulation_avec_changement")
 #add the dataframes to the sheets
   writeWorksheet(dataxls, dataTab1, sheet = "Compartiments-simulation_sans_changement")
   writeWorksheet(dataxls, dataTab2, sheet = "Esperance-simulation_sans_changement")
   writeWorksheet(dataxls, dataTab3, sheet = "Compartiments-simulation_avec_changement")
   writeWorksheet(dataxls, dataTab4, sheet = "Esperance-simulation_avec_changement")

   saveWorkbook(dataxls,file)


}
)

Проблема в том, что у меня следующая ошибка: Ошибка в createWorkbook (файл): Неизвестный формат C: \ Users \ Baramova \ AppData \ Local \ Temp \ Rtmpmyqyeh \ fileafc6d2b5998.xlsx

Я попытался исправить это на следующем примере:

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

Но у меня это не работает. Может, я что-то упускаю. Есть ли у вас какие-либо идеи?

Метод 2: использование пакета RODBC

output $ downloadTab ‹- downloadHandler (

  filename ="Tab.xls",
  content = function(fname) {
    tmpdir <- tempdir()


    db <- paste(tmpdir,fname,sep="/")            
    channel <- odbcConnectExcel(xls.file = db,readOnly=FALSE)
    sqlSave(channel, Compartiments_simulation_sans_changement, tablename = "Compartiments_simulation_sans_changement")
    sqlSave(channel,  Esperance_simulation_sans_changement, tablename = "Esperance_simulation_sans_changement")
    sqlSave(channel, Compartiments_simulation_avec_changement, tablename = "Compartiments_simulation_avec_changement")
    sqlSave(channel, Esperance_simulation_avec_changement, tablename = "Esperance_simulation_avec_changement")
    odbcClose(channel)

    },
    contentType="application/csv" 

)

Проблема в том, что функция odbcConnectExcel () не распознается, даже если я вызвал пакет RODBC, набрав: library (RODBC)

Ты хоть представляешь, почему это так?


person Mily    schedule 22.01.2016    source источник
comment
когда вы пытались исправить xlsx Я пытался исправить, вы пробовали использоватьlibrary(XLConnect)?   -  person Batanichek    schedule 22.01.2016
comment
Когда вы сказали downloadHeader(), это означает downloadHandler или что-то еще?   -  person Batanichek    schedule 22.01.2016
comment
Привет Батаничек. Да, я пробовал использовать библиотеку (XLConnect).   -  person Mily    schedule 22.01.2016
comment
Я сделал ошибку, набрав downloadHeader (). Правильное слово - downloadHandler ().   -  person Mily    schedule 22.01.2016
comment
Еще раз привет, большое спасибо! Очевидно, я не хотел использовать пакет XLConnect, потому что, когда я использую его сейчас, все работает!   -  person Mily    schedule 22.01.2016


Ответы (1)


Я нашел решение своей проблемы.

Сначала вы должны вызвать пакеты XLConnect и RODBC. После этого вы можете использовать следующий пример:

    output$downloadTab <- downloadHandler(  
       filename ="Tab.xls",
       content = function(file) {
           write.csv(Compartiments_simulation_sans_changement, file="Compartiments-simulation_sans_changement.csv")
           write.csv(Esperance_simulation_sans_changement, file="Esperance-simulation_sans_changement.csv")
           write.csv(Compartiments_simulation_avec_changement, file="Compartiments-simulation_avec_changement.csv")
           write.csv(Esperance_simulation_avec_changement, file="Esperance-simulation_avec_changement.csv")

       channel <- odbcConnectExcel(xls.file = file,readOnly=FALSE)
           sqlSave(channel, Compartiments_simulation_sans_changement, tablename = "Compartiments_simulation_sans_changement")
           sqlSave(channel,  Esperance_simulation_sans_changement, tablename = "Esperance_simulation_sans_changement")
           sqlSave(channel, Compartiments_simulation_avec_changement, tablename = "Compartiments_simulation_avec_changement")
           sqlSave(channel, Esperance_simulation_avec_changement, tablename = "Esperance_simulation_avec_changement")
       odbcClose(channel)

    },
    contentType="application/xls" 

)
person Mily    schedule 22.01.2016