2014-01-27 7 views
8

Ich arbeite an der JAVA EXTJS-Anwendung, in der ich eine CSV-Datei erstellen und herunterladen muss.CSV-Datei erstellen und herunterladen Java (Servlet)

Wenn ich auf eine Schaltfläche klicke, möchte ich eine CSV-Datei auf dem Client-Rechner herunterladen.

Auf Schaltflächen Listener rufe ich ein Servlet mit Ajax. Dort erstelle ich eine CSV-Datei.

Ich möchte nicht die CSV-Datei auf dem Server gespeichert werden. Ich möchte die Datei dynamisch mit Download-Option erstellt werden.

Ich möchte den Inhalt einer Datei als String erstellen und dann werde ich den Inhalt als Datei bereitstellen, in der er als Downloadmodus im Browser geöffnet wird. (Dies habe ich in anderer Sprache erreicht, aber nicht sicher wie ich es erreichen soll Es in Java)

Hier ist mein Code nur zum Erstellen von CSV-Datei, aber ich möchte wirklich nicht CSV-Datei erstellen oder speichern, wenn ich nur die Datei als CSV herunterladen kann.

public String createCSV() 
{ 
    try 
    { 
     String filename = "c:\\test.csv"; 
     FileWriter fw = new FileWriter(filename); 
     fw.append("XXXX"); 
     fw.append(','); 
     fw.append("YYYY"); 
     fw.append(','); 
     fw.append("ZZZZ"); 
     fw.append(','); 
     fw.append("AAAA"); 
     fw.append(','); 
     fw.append("BBBB"); 
     fw.append('\n'); 

     CSVResult.close(); 
     return "Csv file Successfully created"; 
    } 
    catch(Exception e) 
    { 
     return e.toString(); 
    } 
} 

Kann mir jemand dabei helfen.

Dank

+0

wo ist Ihr Code? – Raptor

+1

Hier ist Ihre Antwort [http://stackoverflow.com/questions/3190303/how-to-create-csv-file-using-servlet][1] [1]: http: // Stackoverflow .com/questions/3190303/how-to-create-csv-Datei-using-servlet –

Antwort

20

Ich habe die Lösung und ich posten es unten.

public void doGet(HttpServletRequest request, HttpServletResponse response) 
{ 
    response.setContentType("text/csv"); 
    response.setHeader("Content-Disposition", "attachment; filename=\"userDirectory.csv\""); 
    try 
    { 
     OutputStream outputStream = response.getOutputStream(); 
     String outputResult = "xxxx, yyyy, zzzz, aaaa, bbbb, ccccc, dddd, eeee, ffff, gggg\n"; 
     outputStream.write(outputResult.getBytes()); 
     outputStream.flush(); 
     outputStream.close(); 
    } 
    catch(Exception e) 
    { 
     System.out.println(e.toString()); 
    } 
} 

Hier müssen wir die Datei nicht auf dem Server speichern/speichern.

Dank

+0

Was ist 'model.closeConnection()' in diesem Beispiel? Ich sehe kein Objekt namens 'Modell'. – Moob

+0

Hier ist Modell nur ein Name des Objekts, das die closeConnection() - Funktion aufruft, um die Datenbankverbindung zu schließen. Dies ist nur um sicherzustellen, dass die Verbindung geschlossen ist. Sie können es beliebig in Ihrem Code gemäß Ihrem Design platzieren. – Gourav

+0

Okay. Sie fragen sich nur, ob es in Ihrem Beispiel enthalten sein sollte? Das OP erwähnt keine Datenbankverbindung. Es könnte andere wie mich verwirren. Sag einfach;) – Moob

3

Zunächst einmal müssen Sie die HttpServletResponse-Objekt zu erhalten, so dass Sie eine Datei hinein strömen kann.

Hinweis: Dieses Beispiel ist etwas, was ich für eine meiner Projekte Schrieb und es works.Works auf Java 7.

Angenommen Sie haben die HttpServletResponse hast du so etwas tun kann, eine Datei zu streamen. Auf diese Weise wird die Datei auf dem Computer des Kunden gespeichert.

public void downloadFile(HttpServletResponse response){ 

     String sourceFile = "c:\\source.csv"; 
     try { 
      FileInputStream inputStream = new FileInputStream(sourceFile); 
      String disposition = "attachment; fileName=outputfile.csv"; 
      response.setContentType("text/csv"); 
      response.setHeader("Content-Disposition", disposition); 
      response.setHeader("content-Length", String.valueOf(stream(inputStream, response.getOutputStream()))); 

     } catch (IOException e) { 
      logger.error("Error occurred while downloading file {}",e); 
     } 
} 

Und die Stream-Methode sollte so sein.

private long stream(InputStream input, OutputStream output) throws IOException { 

    try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) { 
     ByteBuffer buffer = ByteBuffer.allocate(10240); 
     long size = 0; 

     while (inputChannel.read(buffer) != -1) { 
      buffer.flip(); 
      size += outputChannel.write(buffer); 
      buffer.clear(); 
     } 
     return size; 
    } 
} 

Was das bedeutet ist, eine Eingabestrom aus der Quelldatei erhalten und diesen Strom in den Output des HttpServletResponse schreiben. Das sollte funktionieren, da es perfekt für mich funktioniert. Hoffe das hilft. Entschuldigung für mein schlechtes Englisch.

+0

Wenn CSV-Datei erstellt und auf dem Server gespeichert wird, funktioniert obige Methode. Ich schätze Ihre Antwort und danke. Es funktioniert definitiv. Aber mein Bedürfnis war etwas anderes. Ich habe die Lösung und posten es. – Gourav

0

Ich mag etwas auf die Antwort von gaurav hinzufügen würde. Ich musste diese Funktionalität kürzlich in ein Projekt von mir einfügen und die Verwendung von Javascript kam nicht in Frage, da wir IE 9 unterstützen mussten. Was ist das Problem mit IE 9? (Export to CSV using jQuery and html), siehe die zweite Antwort im Link.

Ich brauchte eine einfache Möglichkeit, um ein ResultSet einer Datenbankabfrage in eine Zeichenfolge zu konvertieren, die die gleichen Daten im CSV-Format darstellen. Dafür habe ich http://opencsv.sourceforge.net/ benutzt, was eine einfache Möglichkeit bot, einen String ot des ResultSets zu bekommen, und der Rest ist wie oben beschrieben.

Die Beispiele im Projekt Sorce Ordner geben gute Beispiele.