2017-05-11 87 views
2

*嗨,我试图从一个独特的Excel文件下载多个csv文件。我想从excel文件下载(只使用一个下载按钮)不同的工作表。 我不明白为什么for()循环不起作用,我看不到我该怎么办? 如果有人知道..用一个按钮(下载处理程序)下载多个csv文件与R Shiny

点的是下载不同的csv文件,这是在“wb”列表(wb [1],wb [2] ...) 谢谢。 这里是我的代码谁与第三片实例(和抱歉,我的英语不好)工作原理: 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")) 
    ) 
    ) 
) 
) 

服务器:

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) 
    } 
#} 
) 
} 
+1

我不认为for循环可以工作。要走的路将是压缩它,我认为,.. – BigDataScientist

+0

是的for循环does'nt工作,这就是为什么我把#放在前面。 自从今天上午以来,我正在寻找代码或以zip()为例解释这种情况,但我还没有找到任何东西..和/或我不明白如何将不同的文件放入zip并下载它。你有任何想法/代码/例子或网站来解释zip函数吗? – MBnnn

回答

0

由于@BigDataScientist指出的那样,你可以压缩所有的csv文件并下载压缩文件。你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) 
    } 
) 

这不会下载Excel文件中的所有表,但范围从1到无论用户在​​输入表。

如果用户没有添加excel文件/名称,也可以禁用下载按钮。

+0

是的,我已经试过这段代码,但是我有这个错误信息: 警告:运行命令'“zip”-r9X ...有状态127 我不知道如何处理这个。 非常感谢您的帮助顺便说一句 – MBnnn

+0

pbly与'邮编'的问题,你在Windows?如果是,你是否安装了RTools? – NicE

+0

请注意,它可能无法在闪亮的预览中工作。尝试启动它像'runApp(shinyApp(ui,server),launch.browser = TRUE)' – BigDataScientist