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