2017-05-11 2 views
2

* Hallo, ich versuche, mehrere CSV-Datei aus einer einzigartigen Excel-Datei herunterladen. Ich möchte die verschiedenen Blätter aus der Excel-Datei herunterladen (mit nur einem Download-Button). Ich verstehe nicht, warum eine for() Schleife nicht funktioniert, und ich kann nicht sehen, wie kann ich tun? Wenn jemand weiß, ..Laden Sie mehrere CSV-Dateien mit einer Taste (Downloadhandler) mit R Shiny

Der Punkt ist differents csv-Dateien, die in dem "wb" -Liste sind (wb [1], wb [2] ...) Dank herunterladen. Hier ist mein Code, der mit dem dritten Blatt zum Beispiel arbeitet (und sorry für mein schlechtes Englisch): 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) 
    } 
#} 
) 
} 
+1

ich denke nicht, dass for-Schleife funktionieren kann. Der Weg zu gehen wäre es zu zippen ich denke, .. – BigDataScientist

+0

Ja die For-Schleife funktioniert nicht, deshalb lege ich ein # vor. Ich suche Code oder Beispiel mit zip() für diese Situation seit heute Morgen, aber ich habe nichts gefunden .. und/oder ich verstehe nicht, wie man verschiedene Dateien in eine zip und laden Sie es. Haben Sie eine Idee/einen Code/ein Beispiel oder eine Website, um die ZIP-Funktion zu erklären? – MBnnn

Antwort

0

Wie @BigDataScientist wies darauf hin, man konnte zip alle Ihre CSV-Datei und laden Sie die gezippte Datei. Ihre downloadHandler könnte wie folgt aussehen:

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) 
    } 
) 

Dieser Download nicht alle Blätter aus der Excel-Datei, sondern die reichen Blätter von 1 zu, was der Benutzer als Eingabe in input$sheet.

Sie können die Download-Schaltfläche auch deaktivieren, wenn der Benutzer keine Excel-Datei/Name hinzugefügt hat.

+0

Ja, ich habe diesen Code bereits ausprobiert, aber ich habe folgende Fehlermeldung: Warnung: Befehl '' zip '-r9X ... hatte Status 127 Ich weiß nicht, wie ich damit umgehen soll. Vielen Dank für Ihre Hilfe btw – MBnnn

+0

Pbly ein Problem mit 'zip', sind Sie unter Windows? Wenn ja, haben Sie RTools installiert? – NicE

+0

Beachten Sie, dass es in der glänzenden Vorschau möglicherweise nicht funktioniert. Versuchen Sie es wie 'runApp (glowApp (ui, server), launch.browser = TRUE)' ' – BigDataScientist

Verwandte Themen