我有一个包含不同表格的Excel文件,我想在服务器一侧阅读,而在 ui 一侧,用户上传文件。
由于我有一个很大的代码,我无法将其粘贴到这里,这就是为什么我会使用一个小例子:
library(shiny)
library(readxl)
shinyApp(
ui = fluidPage(
fileInput("file","Upload the file")
),
server = function(input, output) {
sheets <- readxl::excel_sheets(input$file$datapath)
x <- lapply(sheets, function(X) readxl::read_excel(input$file$datapath, sheet = X))
names(x) <- sheets
}
)
但遗憾的是我收到错误,该函数无法找到给定数据路径的文件。但有趣的是,当我使用fread()
函数时,它识别input$file$datapath
中的文件,但它无法读取.xlsx文件。
我已经尝试了这个question中的解决方案,但它没有用,不知怎样,粘贴paste()
函数返回 0.xlsx 而我的文件就像 fileName.xlsx ,任何解决方案都会非常有用。
答案 0 :(得分:4)
在服务器端,您需要一个反应式环境定义:
server = function(input, output) {
data <- reactive({
sheets <- excel_sheets(input$file$datapath)
x <- lapply(sheets, function(X) readxl::read_excel(input$file$datapath, sheet = X))
names(x) <- sheets
return(x)
})
}
编辑: 使用你的来源 引用"read_excel" in a Shiny app以及用于读取数据框Read all worksheets in an Excel workbook into an R list with data.frames列表中的多个工作表的函数,您可以执行以下操作,它读入列表并呈现str(列表)
library(shiny)
library(readxl)
shinyApp(
ui = fluidPage(
fileInput("file","Upload the file"),
verbatimTextOutput("list_sheets")
),
server = function(input, output) {
read_excel_allsheets <- function(filename) {
sheets <- readxl::excel_sheets(filename)
x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
names(x) <- sheets
x
}
output$list_sheets <- renderPrint({
inFile <- input$file
if(is.null(inFile)){
return(NULL)
}
file.rename(inFile$datapath,paste(inFile$datapath, ".xlsx", sep=""))
list_dfs <- read_excel_allsheets(paste(inFile$datapath, ".xlsx", sep=""))
str(list_dfs)
})
}
)
您遇到的问题(&#34;缺少文件扩展名&#34;)是由于错误地将文件路径转换为闪亮。