Question

Je veux que mes utilisateurs d'applications Web pour télécharger des données sous forme de fichier Excel.

J'ai la fonction suivante pour envoyer un flux d'entrée dans l'objet de réponse.

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

Je voudrais transformer mon HSSFWorkbook objet à un flux d'entrée et de le transmettre à la méthode précédente.

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

Était-ce utile?

La solution

Le problème avec votre question est que vous mélangez OutputStreams et InputStreams. Un InputStream est quelque chose que vous lire et d'un OutputStream est quelque chose que vous écrivez.

Voici comment j'écris un objet de POI au flux de sortie.

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

Si vous voulez réutiliser votre code existant que vous auriez à stocker les données de POI quelque part puis le transformer en un flux d'entrée. Ce serait facile à faire en écrivant à un ByteArrayOutputStream, puis lire ces octets en utilisant un ByteArrayInputStream, mais je ne le recommanderais pas. Votre méthode existante serait plus utile en tant que mise en œuvre de tuyauterie générique, où vous pouvez envoyer les données à partir d'un InputStream vers et OutputStream, mais vous n'avez pas besoin pour écrire des objets de POI.

Autres conseils

vous pouvez créer un InputStream à partir d'un objet.

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

Je pense que je comprends ce que vous essayez de faire (je suis peut-être se posant, cependant)

vous ne vraiment pas besoin que beaucoup de code - vérifier la méthode d'écriture -

HSSFWorkbook wb = new HSSFWorkBook();
//populate

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

Pour autant que je me souviens quand je travaillais avec / POI c'est ce que je faisais. Si vous êtes à l'intérieur d'un framework web que vous pourriez avoir à finaggle pour que le cadre ne cherche pas à faire quelque chose avec la ServletOutputStream qui après avoir fermé il. Si elle tente, vous obtenez un jet d'exception vous dire que le flux de sortie est déjà fermé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top