Creare e Scaricare file CSV Java(Servlet)

Sto lavorando su JAVA EXTJS applicazione in cui ho la necessità di creare e scaricare un file CSV.

Facendo clic su un pulsante voglio un file CSV per essere scaricato nella macchina del cliente.

Sui pulsanti ascoltatore sto chiamando un servlet utilizzando ajax. Ci sto creando un file CSV.

Non voglio che il file CSV per essere salvati nel server. Voglio che il file deve essere creato in modo dinamico con opzione di download.

Voglio il contenuto di un file viene creato come stringa e poi mi servirà il contenuto del file in cui verrà aperto in modalità di download del browser.( Questo l’ho raggiunto in altre lingue, ma non sono sicuro di come ottenere in java )

Ecco il mio codice per creare un file CSV, ma io davvero non voglio creare o salvare il file CSV se posso solo scaricare i file come file CSV.

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

Uno può aiutarmi in questo.

Grazie

InformationsquelleAutor Gourav | 2014-01-27

 

3 Replies
  1. 27

    Ho la soluzione e sto postando di seguito.

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

    Qui non abbiamo bisogno di memorizzare /archiviare i file nel server.

    Grazie

    • che cosa è model.closeConnection() in questo esempio? Non vedo nessun oggetto chiamato model.
    • Qui il modello è solo un nome di un oggetto che si chiama il closeConnection() funzione per chiudere la connessione al db. Questo è solo per assicurarsi che la connessione è chiusa. Si può posizionare in qualsiasi punto del codice per la progettazione.
    • Va bene. Solo chiedendo se si dovrebbe essere incluso nel tuo esempio? L’OP non fa menzione di una connessione di database. Potrebbe confondere gli altri come ha fatto con me. Just sayin’ 😉
    • Ho provato il tuo codice ma non funziona per me. Come si fa a fare l’ajax chiamata? Ho appena fatto $.get( "SERVLETNAME", { parameters }, function( ) {});
  2. 4

    Prima di tutto, è necessario per ottenere il HttpServletResponse oggetto in modo che è possibile lo streaming di un file in esso.

    Nota : Questo esempio è una cosa che ho Scritto per uno dei miei progetti, e funziona.Funziona su Java 7.

    Supponendo che hai HttpServletResponse si può fare qualcosa di simile per il flusso di un file. In questo modo il file verrà salvato in clienti’ macchina.

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

    E il flusso di metodo dovrebbe essere come questo.

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

    Quello che fa è, ottenere un inputstream dal file di origine e di scrivere che il flusso nel outputstream di HttpServletResponse. Questo dovrebbe funzionare dato che funziona perfettamente per me. Spero che questo aiuta. Mi dispiace per il mio cattivo inglese.

    • Se il file CSV viene creato e memorizzato nel server, quindi al di sopra di metodo di lavoro. Apprezzo la tua risposta e grazie. Sicuramente funziona. Ma il mio bisogno era qualcosa di diverso. Ho la soluzione e di distacco.
  3. 0

    Vorrei aggiungere qualcosa alla risposta da gaurav. Recentemente ho dovuto implment questa funzionalità in un mio progetto e l’utilizzo di javascript, era fuori questione, perché abbiamo dovuto sostenere IE 9. Qual è il problema con IE 9?
    (Esportazione in formato CSV utilizzando jQuery e html), vedere la seconda risposta nel link.

    Avevo bisogno di un modo semplice per convertire un gruppo di Risultati di una query di database ad una stringa che rappresentano gli stessi dati in formato CSV. Per questo ho usato http://opencsv.sourceforge.net/ che ha fornito un modo semplice per ottenere una Stringa ot del gruppo di Risultati, e il resto come sopra risposta l’ha fatto.

    Gli esempi nel progetto soruce cartella di dare il buon esempio.

Lascia un commento