"read_excel" in a Shiny app "read_excel" in a Shiny app r r

"read_excel" in a Shiny app


This was an open issue with the readxl package. The current workaround provided there is to copy the file data path and append .xlsx. Here is a working example on my machine limited to .xlsx files edited to use file.rename instead of file.copy.

library(shiny)library(readxl)runApp(    list(        ui = fluidPage(            titlePanel("Use readxl"),            sidebarLayout(                sidebarPanel(                    fileInput('file1', 'Choose xlsx file',                              accept = c(".xlsx")                              )                    ),                mainPanel(                    tableOutput('contents'))                )            ),        server = function(input, output){            output$contents <- renderTable({                inFile <- input$file1                if(is.null(inFile))                    return(NULL)                file.rename(inFile$datapath,                          paste(inFile$datapath, ".xlsx", sep=""))                read_excel(paste(inFile$datapath, ".xlsx", sep=""), 1)            })        }        )    )

EDITNote that with the 1.1.0 version of readxl it no longer needs to have the file renamed. The following works without a problem for me now.

library(shiny)library(readxl)runApp(  list(    ui = fluidPage(      titlePanel("Use readxl"),      sidebarLayout(        sidebarPanel(          fileInput('file1', 'Choose xlsx file',                    accept = c(".xlsx")          )        ),        mainPanel(          tableOutput('contents'))      )    ),    server = function(input, output){      output$contents <- renderTable({        req(input$file1)        inFile <- input$file1        read_excel(inFile$datapath, 1)      })    }  ))


to ensure that the user does upload an .xlsx file, or you need to check the extension you're self to switch between read functions. You can extract the extension as following:

library(shiny)library(readxl)runApp(list(    ui = fluidPage(        titlePanel("Use readxl"),        sidebarLayout(            sidebarPanel(                fileInput('file1', 'Choose xlsx file',                          accept = c(".xlsx")                          )                ),            mainPanel(                tableOutput('contents'))            )        ),    server = function(input, output){        output$contents <- renderTable({            inFile <- input$file1            if(is.null(inFile))                return(NULL)            ext <- tools::file_ext(inFile$name)            file.rename(inFile$datapath,               paste(inFile$datapath, ext, sep="."))            read_excel(paste(inFile$datapath, ext, sep="."), 1)         })        }    ))