web-dev-qa-db-fra.com

"read_Excel" dans une application brillante

J'ai une application Shiny qui utilise la fonction read.xlsx du paquet xlsx. Tout fonctionne bien, mais je souhaite passer de readxl à read_Excel, en espérant que ce serait plus rapide et capable de gérer des fichiers volumineux.

partie ui:

fileInput("inputFile","Upload file...")

partie serveur:

  data <- reactive({
    inFile <- input$inputFile
    if (is.null(inFile)) { return(NULL) }    
    dataFile <- read_Excel(inFile$datapath,sheet=1)
    return(dataFile)
  })

Je reçois l'erreur "Format inconnu".

inFile $ datapath est "/tmp/.../60974676c7287e913d1c0dc5/0" 
inFile $ type est "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

Question 1: y a-t-il un moyen de dire à read_Excel qu'il s'agit d'un fichier de type xlsx?
Question 2: est-il possible de contrôler l'emplacement où le fichier téléchargé sera stocké?

14
polTo

C'était un problème ouvert avec le paquetage readxl. La solution actuelle fournie consiste à copier le chemin de données du fichier et à ajouter .xlsx. Voici un exemple de travail sur ma machine limité aux fichiers .xlsx édités pour utiliser file.rename au lieu de 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)
            })
        }
        )
    )

EDIT Notez qu'avec la version 1.1.0 de readxl, le fichier ne doit plus être renommé. Ce qui suit fonctionne sans problème pour moi maintenant.

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

pour vous assurer que l’utilisateur télécharge un fichier .xlsx ou vous devez vérifier l’extension que vous utilisez pour basculer entre les fonctions de lecture. Vous pouvez extraire l'extension comme suit:

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