2016-01-22 84 views
1

我使用R包Shiny開發自己的Web應用程序。以多張作爲數據框下載xls文件Shiny R

我有一個下載按鈕,允許我將數據導出到excel文件。在excel文件中,有4張紙,每張紙上都有一個數據框。

例如,sheet1中有dataTab1,sheet2中有dataTab2,sheet3中有dataTab3,sheet4中有dataTab4。

爲此,我使用函數downloadHeader()在閃亮的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:\用戶\ Baramova \應用程序數據\本地\ 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) 
} 

但事實並非如此W¯¯ ork對我來說。也許我正在省略一些東西。 你有什麼想法嗎?

方法2:使用RODBC包

輸出$ 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" 

) 

的問題是,即使我已經通過鍵入稱爲RODBC包的odbcConnectExcel()函數無法識別: 庫(RODBC)

你有任何想法,爲什麼會這樣

+0

當你試圖修復'xlsx'「我已經嘗試了」,你有沒有嘗試use'library(XLConnect)'? – Batanichek

+0

當你告訴'downloadHeader()'它意味着'downloadHandler'或者其他的東西? – Batanichek

+0

你好Batanichek。是的,我試圖使用庫(XLConnect)。 – Mily

回答

2

?我找到了我的問題的解決方案。

首先你必須調用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" 

)