R Shiny加载多Sheet Excel文件报错:path must be a string
解决Shiny中合并Excel多Sheet时的"path must be a string"错误
问题概况
上传包含8个Sheet的xlsx文件,尝试用bind_rows合并所有Sheet为单个DataFrame,运行Shiny应用时无输出,报错:
Error : path must be a string
错误原因
- 未处理初始空状态:应用启动时
input$file1为NULL,直接访问fname$datapath会让excel_sheets等函数接收到无效参数,触发路径非字符串的错误。 - 文件路径传递错误:调用
read_excel时传入的是完整的fileInput对象fname,而非实际文件路径字符串fname$datapath。
修正后的完整代码
library(shiny) library(readxl) library(tidyverse) library(dplyr) # Define UI for application ui <- fluidPage( # Application title titlePanel("SDV Complaince Report"), # Sidebar with file input sidebarLayout( sidebarPanel( fileInput("file1", "Choose Excel File", multiple = FALSE, accept = c(".xls", ".xlsx")) ), # Show merged table output mainPanel( tableOutput("contents") ) ) ) # Define server logic required server <- function(input, output) { output$contents <- renderTable({ # 确保文件已上传后再执行后续逻辑 req(input$file1) fname <- input$file1 # 获取所有Sheet名称 sheets <- excel_sheets(fname$datapath) # 读取每个Sheet,注意传入的是datapath而非整个file对象 data_frames <- lapply(setNames(sheets, sheets), function(x) read_excel(fname$datapath, sheet = x, col_names = FALSE)) # 转换第5列(...5)为数值型 for(i in seq_along(data_frames)) { data_frames[[i]]$...5 <- as.numeric(data_frames[[i]]$...5) } # 合并所有Sheet,添加Sheet列标记来源 bind_rows(data_frames, .id = "Sheet") }) } # Run the application shinyApp(ui = ui, server = server)
关键修正点
- 添加
req(input$file1):阻止应用在未上传文件时执行后续代码,避免空值引发的错误。 - 修正
read_excel的路径参数:将fname改为fname$datapath,传递正确的文件路径字符串。 - 变量名优化:将
data_frame改为data_frames(复数形式更符合存储多个Sheet数据的语义)。
内容的提问来源于stack exchange,提问作者san
相关产品推荐
相关产品推荐

