简体   繁体   English

使用 R Shiny 一键下载多个 csv 文件(downloadhandler)

[英]Download multiple csv files with one button (downloadhandler) with R Shiny

*Hi, I'm trying to download multiple csv file from a unique excel file. *您好,我正在尝试从一个唯一的 excel 文件下载多个 csv 文件。 I want to download (using only one downloadbutton) the differents sheets from the excel file.我想从 excel 文件下载(仅使用一个下载按钮)差异表。 I don't understand why a for() loop doesn't work, and I can't see how can I do?我不明白为什么 for() 循环不起作用,而且我看不出我该怎么做? If anyone knows..如果有人知道..

The point is to download differents csv files, which are in the "wb" list (wb[1],wb[2]...) Thanks.重点是下载不同的 csv 文件,这些文件位于“wb”列表中(wb[1]、wb[2]...)谢谢。 Here is my code who works with the third sheet for instance (and sorry for my bad english): ui:例如,这是我使用第三张纸的代码(抱歉我的英语不好):ui:

library(readxl)
library(shiny)
library(XLConnect)
fluidPage(
titlePanel("Export onglets en CSV"),
  sidebarLayout(
    sidebarPanel(
      fileInput('fichier1','Choisissez votre fichier excel :',
                accept = ".xlsx"),
      fluidPage(
    fluidRow(
      column(width = 12,
             numericInput("sheet","Indiquez l'onglet à afficher :",min = 1, value = 1),
             tags$hr(),
             textInput('text',"Indiquez le nom des fichiers :"),
             tags$hr(),
             h4("Pour télécharger les fichiers .csv :"),
             downloadButton("download","Télécharger")
             )

    )
  )),
mainPanel(
  tabsetPanel(
    tabPanel('Importation',
             h4("Fichier de base:"),
             dataTableOutput("contents"))
      )
    )
  )
)

Server:服务器:

function(input,output){

  #Création data :
  data <- reactive({
    inFile<- input$fichier1
    if (is.null(inFile)){
      return(NULL)
    }else{
      file.rename(inFile$datapath,
              paste(inFile$datapath,".xlsx", sep =""))
      wb = loadWorkbook(paste(inFile$datapath,".xlsx",sep=""))
      lst = readWorksheet(wb,sheet = getSheets(wb))
      list(wb = wb, lst = lst)
    }
  })



  #Sortie de la table :
  output$contents <- renderDataTable({
    data()$wb[input$sheet]
  },options = list(pageLength = 10))


  #Téléchargement :
  output$download <- downloadHandler(

    #for (i in 1:input$sheet){

    filename = function(){
      paste(input$text,"_0",3,".csv",sep = "")
    },
    content = function(file){
      write.table(data()$wb[3],file,
                  sep = ';', row.names = F, col.names = T)
    }
#}
  )
}

As @BigDataScientist pointed out, you could zip all of your csv file and download the zipped file. 正如@BigDataScientist指出的那样,您可以压缩所有csv文件并下载压缩文件。 Your downloadHandler could look like: 您的downloadHandler可能如下所示:

output$download <- downloadHandler(
    filename = function(){
      paste0(input$text,".zip")

    },
    content = function(file){
      #go to a temp dir to avoid permission issues
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      files <- NULL;

      #loop through the sheets
      for (i in 1:input$sheet){
        #write each sheet to a csv file, save the name
        fileName <- paste(input$text,"_0",i,".csv",sep = "")
        write.table(data()$wb[i],fileName,sep = ';', row.names = F, col.names = T)
        files <- c(fileName,files)
      }
      #create the zip file
      zip(file,files)
    }
  )

This does not download all the sheets from the excel file but the sheets ranging from 1 to whatever the user has as input in input$sheet . 这不会从excel文件中下载所有工作表,但工作表范围从1到input$sheet用户输入的任何内容。

You could also disable the download button if the user has not added an excel file/name. 如果用户尚未添加excel文件/名称,您也可以禁用下载按钮。

Hope you've solved this MBnn, but in case anyone else is having similar problems, this case is down to RTools not being installed correctly on windows. 希望你已经解决了这个MBnn,但是如果其他人遇到类似的问题,这个案例归结为RTools没有在Windows上正确安装。

Currently you need to play close attention while running through the install process, and make sure to hit the checkbox to edit the system path. 目前,您需要在运行安装过程时密切关注,并确保点击复选框以编辑系统路径。

Based on your code, this is likely to be the same issue preventing you from saving XLSX workbooks too. 根据您的代码,这可能是阻止您保存XLSX工作簿的同一问题。

I know this is an old thread but I had the same issue and the top answer did not work for me.我知道这是一个旧线程,但我遇到了同样的问题,而且最佳答案对我不起作用。 However a simple tweak and using the archive package worked.然而,一个简单的调整和使用存档package 工作。

Reproductible example below:下面的可重现示例:

library(shiny)
library(archive)

shinyApp(
  # ui
  ui = fluidPage(downloadButton("dl")),
  # server
  server = function(input, output, session) {
    # download handler
    output$dl <- downloadHandler(
      filename = function() {"myzipfile.zip"},
      # content: iris and mtcars
      content = function(file) {
        # definition of content to download
        to_dl <- list(
          # names to use in file names
          names = list(a = "iris",
                       b = "mtcars"),
          # data
          data = list(a = iris,
                      b = mtcars)
        )
        
        # temp dir for the csv's as we can only create
        # an archive from existent files and not data from R
        twd <- setwd(tempdir())
        on.exit(setwd(twd))
        files <- NULL
        
        # loop on data to download and write individual csv's
        for (i in c("a", "b")) {
          fileName <- paste0(to_dl[["names"]][[i]], ".csv") # csv file name
          write.csv(to_dl[["data"]][[i]], fileName) # write csv in temp dir
          files <- c(files, fileName) # store written file name
        }
        
        # create archive from written files
        archive_write_files(file, files)
      }
    )
  }
)

This will create the zip file myzipfile.zip which will contain iris.csv and mtcars.csv .这将创建 zip 文件myzipfile.zip ,其中将包含iris.csvmtcars.csv

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM