在一个工作簿中导出多个Excel工作表R Shiny [英] Exporting multiple excel sheets in one workbook R shiny

查看:94
本文介绍了在一个工作簿中导出多个Excel工作表R Shiny的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

链接到xlsx文件中的数据(数据在第4张纸中) ,链接到csv文件中的数据
图书馆(闪亮) 库(xlsx)

link to data in xlsx file (data is in 4th sheet),link to data in csv file
library(shiny) library(xlsx)

shinyUI(fluidPage(

  titlePanel("Tim O'Leary"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose File',
             accept=c('text/csv', 
                     'text/comma-separated-values,text/plain', 
                     c(".txt",'.csv'))),
  downloadButton('downloadData', 'Download'),
  tags$hr(),
  checkboxInput('header', 'Header', TRUE),
  radioButtons('sep', 'Separator',
               c(Comma=',',
                 Semicolon=';',
                 Tab='\t'),
               '\t'),
  radioButtons('quote', 'Quote',
               c(None='',
                 'Double Quote'='"',
                 'Single Quote'="'"),
               '"')

),
mainPanel(

  #tableOutput('contents')
  tabsetPanel(
    tabPanel("RawTable", tableOutput('contents')),
    tabPanel("Table1", tableOutput('a')),
    tabPanel("Table2", tableOutput("b")),
    tabPanel("Table3", tableOutput("c"))

  )
 )
  )
 ))

 library(shiny)
  library(xlsx)

 shinyServer(function(input, output) {

 rawData <- reactive({
 filet <- input$file1
   if(is.null(filet)) return()
   data <- read.csv(filet$datapath)
   })

  #dtableInput<- reactive({
       # if(is.null(rawData())) 
  #   return()
  #  data<-rawData()        
   #})

   a <- reactive({
     a <- subset(rawData(), AssertionString == "10046")
    a
 })

  b <- reactive({
   b <- subset(rawData(), AssertionString == "10074")
   b
  })

 c <- reactive({
   c <- subset(rawData(), AssertionString == "10179")
   c
 })

 # workBook <- reactive({
#    processor <- createWorkbook()
 #    page1 <- createSheet(wb=processor, sheetName="iam")
  #   page2 <- createSheet(wb=processor, sheetName="tim")
  #  page3 <- createSheet(wb=processor, sheetName="oleary")
   # page4 <- createSheet(wb=processor, sheetName="J")
   #addDataFrame(x=rawData(), sheet=page1)
#    addDataFrame(x=a(), sheet=page2)
 #   addDataFrame(x=b(), sheet=page3)
  #  addDataFrame(x=c(), sheet=page4)
  # wb <- saveWorkbook(processor,"processorData")
 #  wb
 #})

 output$contents <- renderTable({
       rawData()
      })

     output$a <- renderTable({
          a()
       })

       output$b <- renderTable({
       b()
        })

     output$c <- renderTable({
        c()
           })

        output$downloadData <- downloadHandler(
      filename = function() {paste("file_name", '.cvs')},
       content = function(file){
         write.csv(a(), file="file_name")
          #write.xlsx2(a(), file="file_name.xlsx", sheetName="sheet1")
            #write.xlsx2(b(), file="file_name.xlsx", sheetName="sheet2",                                    append=T)
       })
#rbind allows you to connect dfs in column like manner

     })

这些是我的ui和服务器脚本,它们以r Shiny开头,我正在尝试将rawData,a,b和c数据框导出到excel工作簿中,每个数据框都有自己的工作表.我试图读取一个csv文件并以这种方式导出,但是我找不到一个允许我以使用write.csv的方式导出这些文件的函数.然后,我尝试导入为.xlsx并使用write.xlsx2,因为rawData太大,无法仅用于write.xlsx,当我在单击下载按钮时使用write.xlsx2时,它将加载无数时间,但从未下载任何事物.任何帮助或建议将不胜感激

These are my ui and server scripts in r shiny and I'm trying to export the dataframes rawData,a,b,and c into an excel workbook with each dataframe having its own sheet. I have tried reading in a csv file and exporting it that way but I cannot find a function that allows me to export these the way I need to using write.csv. I then tried importing as .xlsx and used write.xlsx2 because the rawData is too big for just write.xlsx, and when I used write.xlsx2 upon clicking my download button, it would just load for an endless amount of time but never download anything. Any help or advice will be appreciated thanks

推荐答案

无法下载数据,但这是一个有效的示例.您可以带有标题的任何csv文件上载,并指定一列,然后可以下载xlsx文件,其中csv文件根据所选列中的每个唯一值分为多个选项卡.请注意,write.xlsx函数的运行速度相当慢,因此您可能需要等待一段时间,具体取决于csv文件的大小.

Cannot download your data, but here is an example that works. You can upload any csv files with headers, and specify a column, and you can then download an xlsx file where the csv file is splitted into multiple tabs based on each unique value in the selected column. Note that the write.xlsx function is fairly slow, so you might need to wait a while depending on your csv file size.

library(shiny)

ui <- shinyUI(fluidPage(

   titlePanel("CSV Splitter"),

   sidebarLayout(
      sidebarPanel(
        fileInput("file", "Upload csv file", accept="text/csv"),
        uiOutput("column_ui"),
        downloadButton("download")
      ),

      mainPanel(
      )
   )
))

server <- shinyServer(function(input, output) {

    data <- reactive({
        if (is.null(input$file)) {
            return(NULL)
        } else {
            return(read.csv(input$file$datapath, header=TRUE))
        }
    })

    output$column_ui <- renderUI({
        selectInput("column", "Select a column to split by unique values", unique(names(data())))
    })

    output$download <- downloadHandler(
        filename = "result.xlsx",
        content = function(file) {
            column_data = data()[[input$column]]
            unique_values = unique(column_data)
            write.xlsx(data()[data()[[input$column]] == unique_values[1],], file, as.character(unique_values[1]))
            for (i in 2:length(unique_values)) {
                write.xlsx(data()[data()[[input$column]] == unique_values[i],], file, as.character(unique_values[i]), append = TRUE)
            }
        }
    )

})

# Run the application 
shinyApp(ui = ui, server = server)

这篇关于在一个工作簿中导出多个Excel工作表R Shiny的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆