2017-08-01 43 views
1

我有一个excel文件和不同的工作表,我想在服务器端读取它,而在用户端端用户上传文件。无法读取R文件中的Excel文件

因为我有一个大的代码,我不能在这里贴,这就是为什么我会用一个小例子:

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,任何解决方案将是非常有益的。

回答

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

您遇到的问题(“缺少文件扩展名”)是由于不正确的译文件路径变成闪亮。

+0

我收到此错误:警告:错误:缺少文件扩展名。 堆栈跟踪(最里面的第一个), 这不是关于被动的问题是函数read_excel()和excel_sheets()不能像fread()那样读取数据路径值。 –

+0

我明白你的意思了,我也相应地调整了答案。 –