Frage

Ich möchte meine Web-Anwendung Benutzer einige Daten als Excel-Datei zum Download bereit.

Ich habe die nächste Funktion eines Eingangsstroms in dem Antwortobjekt zu senden.

public static void sendFile(InputStream is, HttpServletResponse response) throws IOException {
        BufferedInputStream in = null;
        try {
            int count;
            byte[] buffer = new byte[BUFFER_SIZE];
            in = new BufferedInputStream(is);
            ServletOutputStream out = response.getOutputStream();
            while(-1 != (count = in.read(buffer)))
                out.write(buffer, 0, count);
            out.flush();            
        }   catch (IOException ioe) { 
            System.err.println("IOException in Download::sendFile"); 
            ioe.printStackTrace();
        } finally {
            if (in != null) {
                try { in.close(); 
                } catch (IOException ioe) { ioe.printStackTrace(); }
            }   
        }
    }

Ich möchte mein HSSFWorkbook Objekt an einen Eingangsstrom zu transformieren und an die vorherige Methode übergeben.

public InputStream generateApplicationsExcel() {
    HSSFWorkbook wb = new HSSFWorkbook();
    // Populate the excel object
    return null; // TODO. return the wb as InputStream 
}

http://poi.apache.org/ apidocs / org / apache / poi / HSSF / usermodel / HSSFWorkbook.html

War es hilfreich?

Lösung

Das Problem mit Ihrer Frage ist, dass Sie OutputStreams und Inputstreams mischen. Ein Input ist etwas, das man lesen und ein Outputstream ist etwas, das Sie zu schreiben.

Dies ist, wie ich ein POI-Objekt in den Ausgabestream schreiben.

// this part is important to let the browser know what you're sending
response.setContentType("application/vnd.ms-excel");
// the next two lines make the report a downloadable file;
// leave this out if you want IE to show the file in the browser window
String fileName = "Blah_Report.xls";
response.setHeader("Content-Disposition", "attachment; filename=" + fileName); 

// get the workbook from wherever
HSSFWorkbook wb = getWorkbook();
OutputStream out = response.getOutputStream();
try {
   wb.write(out);
}       
catch (IOException ioe) { 
  // if this happens there is probably no way to report the error to the user
  if (!response.isCommited()) {
    response.setContentType("text/html");
    // show response text now
  }
}

Wenn Sie wieder verwenden Ihre vorhandenen Code wollten Sie würde die POI-Daten zu speichern, irgendwo dann wiederum, dass in einem Eingangsstrom. Die leicht zu einem ByteArrayOutputStream erfolgen würde durch das Schreiben, dann diese Bytes mit einem ByteArrayInputStream zu lesen, aber ich würde es nicht empfehlen. Ihre bestehende Methode wäre nützlicher als Oberrohr Implementierung, wo Sie Rohr der Daten von einem Inputstream und Outputstream, aber Sie brauchen es nicht für POI-Objekte zu schreiben.

Andere Tipps

Sie ein Inputstream von einem Objekt erstellen können.

public InputStream generateApplicationsExcel() {
    HSSFWorkbook wb = new HSSFWorkbook();
    // Populate a InputStream from the excel object
    return new ByteArrayInputStream(excelFile.getBytes());
}

Ich glaube, ich verstehe, was Sie versuchen zu tun (vielleicht bin ich Unterschreitung, obwohl)

Sie brauchen nicht wirklich so viel Code - Überprüfen Sie die Schreibmethode aus -

HSSFWorkbook wb = new HSSFWorkBook();
//populate

ServletOutputStream out = response.getOutputStream();
try {
   wb.write(out);
   out.flush();
}       
catch (IOException ioe) { 
   //whatever
}
out.close();

Soweit ich erinnere mich, als ich w / POI gearbeitet, das ist das, was ich tat. Wenn Sie in einem Web-Framework haben, bekommen Sie es finaggle haben, so dass der Rahmen nicht etwas, mit dem dieser ServletOutputStream nicht versuchen zu tun, nachdem Sie es geschlossen haben. Wenn es versucht, erhalten Sie eine Ausnahme zu werfen bekommen Sie sagen, dass der Ausgangsstrom bereits geschlossen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top