You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shiny代码中调用Excel两个工作表分别生成表格与图表

代码修改方案

原代码默认仅读取Excel的第一个工作表,只需拆分数据读取逻辑,分别读取两个工作表对应不同页面使用即可,修改点如下:

  • 拆分原有data响应式变量为两个:data_first读取FIRST工作表,为PAGE1的表格提供数据;data_second读取SECOND工作表,为PAGE2的图表提供数据
  • PAGE1关联的日期范围生成、表格渲染逻辑全部调整为调用data_first
  • PAGE2关联的日期选择器、分类下拉框、图表渲染逻辑全部调整为调用data_second
修改后完整可运行代码
library(shiny)
library(shinythemes)
library(readxl)
library(dplyr)

ui <- fluidPage(
  
  shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                    br(),
                    tabPanel("PAGE1",
                             sidebarLayout(
                               sidebarPanel(
                                 uiOutput('fileInput'),
                                 uiOutput('daterange')
                                 
                               ),
                               mainPanel(
                                 dataTableOutput('table')
                               )
                             )),
                    
                    tabPanel("PAGE2",
                             sidebarLayout(
                               sidebarPanel(
                                 uiOutput('date'),
                                 uiOutput("mycode")
                                 
                               ),
                               mainPanel(
                                 tabsetPanel(
                                   tabPanel("", plotOutput("graph",width = "100%", height = "600")
                                   )
                                 ))
                             ))))

server <- function(input, output,session) {
  
  output$fileInput <- renderUI({
    fileInput("file",h4("Import file"), multiple = T, accept = ".xlsx")
  })
  
  # 读取FIRST工作表,用于PAGE1表格展示
  data_first <- reactive({
    if (is.null(input$file)) {
      return(NULL)
    }
    
    else {
      df3 <- read_excel(input$file$datapath, sheet = "FIRST")
      validate(need(all(c('date1', 'date2') %in% colnames(df3)), "FIRST工作表字段错误"))  
      df4 <- df3 %>% mutate_if(~inherits(., what = "POSIXct"), as.Date) 
      return(df4)
    }
  })
  
  # 读取SECOND工作表,用于PAGE2图表生成
  data_second <- reactive({
    if (is.null(input$file)) {
      return(NULL)
    }
    
    else {
      df3 <- read_excel(input$file$datapath, sheet = "SECOND")
      validate(need(all(c('date1', 'date2', 'Category', 'DR02', 'DR1') %in% colnames(df3)), "SECOND工作表字段错误"))  
      df4 <- df3 %>% mutate_if(~inherits(., what = "POSIXct"), as.Date) 
      return(df4)
    }
  })
  
  data_subset <- reactive({
    req(input$daterange1)
    req(input$daterange1[1] <= input$daterange1[2])
    days <- seq(input$daterange1[1], input$daterange1[2], by = 'day')
    subset(data_first(), date2 %in% days)
  })
  
  
  output$table <- renderDataTable({
    data_subset()
  })
  
  output$daterange <- renderUI({
    req(data_first())
    dateRangeInput("daterange1", "Period you want to see:",
                   min = min(data_first()$date2),
                   max = max(data_first()$date2))
  })
  
  
  output$date <- renderUI({
    req(data_second())
    all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day")
    disabled <- as.Date(setdiff(all_dates, as.Date(data_second()$date2)), origin = "1970-01-01")
    entrydate<- dateInput(input = "Date2", 
                          label = h4("Choose"),
                          min = min(data_second()$date2),
                          max = max(data_second()$date2),
                          format = "dd-mm-yyyy",
                          datesdisabled = disabled)
    entrydate$children[[2]]$attribs$placeholder <- "No selected date"
    entrydate
  })
  
  
  output$mycode <- renderUI({
    req(input$Date2)
    df1 <- data_second()
    df5 <- df1[as.Date(df1$date2) %in% input$Date2,]
    selectInput("code", label = h4("Category"),choices=c("No code selected" = "", sort(unique(df5$Category))))
  })
  
  output$graph <- renderPlot({
    df1 <- data_second()
    req(input$Date2,input$code)
    plot(x=df1$DR02,y=df1$DR1)})
  
  
}

shinyApp(ui = ui, server = server) 

内容的提问来源于stack exchange,提问作者Antonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:06:03