2012-06-27 18 views
15

Sono in grado di creare un file excel usando apache poi. tuttavia, voglio che gli utenti siano in grado di scaricarlo come un file di Excel "vero". l'effetto che voglio ottenere sarebbe avere una finestra popup che permetta all'utente di scaricare il file. è simile all'utilizzo diCreare un file excel da scaricare dagli utenti usando Apache POI

<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%> 
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %> 

con un'eccezione critica: devo consentire all'utente di scaricare un file di Excel corretto. Ho letto da qualche parte il codice di cui sopra dice semplicemente al client che il server invia il file

risposta

32

fare il lavoro in una servlet normale invece di un file JSP un Excel. Un file JSP è pensato per generare dinamicamente il codice HTML e sta utilizzando un writer di caratteri per questo invece di un flusso di output binario e quindi corromperà solo il file Excel generato da PDI che è essenzialmente un flusso binario.

Quindi, in pratica tutto quello che dovete fare nel metodo del servlet doGet() è il seguente:

response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition", "attachment; filename=filename.xls"); 
HSSFWorkbook workbook = new HSSFWorkbook(); 
// ... 
// Now populate workbook the usual way. 
// ... 
workbook.write(response.getOutputStream()); // Write workbook to response. 
workbook.close(); 

Ora, per scaricarlo, richiamare il servlet dal suo URL al posto del file JSP.

+0

writableworkbook è parte di il jexcel api giusto? questo dovrebbe funzionare anche se im usando poi giusto? – user571099

+0

@ user571099 la cartella di lavoro è un 'HSSFWorkbook' qui, non un' WritableWorkbook'. –

+0

Questo era esattamente quello che stavo cercando! Presumo che questo possa essere fatto in modo simile con il servizio web Jersey RESTful? – Brian

20

Se è vero che è più usuale per scrivere un allegato binario utilizzando un servlet piuttosto che una jsp, è certamente possibile scrivere un allegato binario da una jsp. E il vantaggio di farlo è che non devi preoccuparti di configurare web.xml o ricaricare la tua applicazione. Questa può essere una considerazione importante, a seconda dell'ambiente del server web.

Ecco un esempio di jsp che utilizza poi per inviare un allegato binario a un browser.

<%@page import="org.apache.poi.hssf.usermodel.*" %><%@page import="java.io.*" %><% 

// create a small spreadsheet 
HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet(); 
HSSFRow row = sheet.createRow(0); 
HSSFCell cell = row.createCell(0); 
cell.setCellValue("Some text"); 

// write it as an excel attachment 
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); 
wb.write(outByteStream); 
byte [] outArray = outByteStream.toByteArray(); 
response.setContentType("application/ms-excel"); 
response.setContentLength(outArray.length); 
response.setHeader("Expires:", "0"); // eliminates browser caching 
response.setHeader("Content-Disposition", "attachment; filename=testxls.xls"); 
OutputStream outStream = response.getOutputStream(); 
outStream.write(outArray); 
outStream.flush(); 

%> 

Il trucco importante è assicurarsi che ci sia una sola riga con tutti i vostri le importazioni e le altre direttive prima della "<%" che inizia il codice. In caso contrario, jsp potrebbe emettere alcune nuove righe iniziali e corrompere l'output.

Inoltre, suggerisco di impostare sempre la lunghezza del contenuto. Alcuni browser non funzioneranno correttamente se non sono impostati. Questo è il motivo per cui prima ho inviato il mio foglio di calcolo a un array di byte, quindi ho potuto impostare la lunghezza prima di inviare effettivamente i dati.

+0

Grazie per la risposta, ma posso chiederti dove definisci il percorso del file xls? Voglio dire, come sa jsp, dove scegliere il file xls? Potrebbe funzionare con il pdf, che è stato creato dal programma java prima? –

0

se volete scaricare don, t utilizzare HSSF cartella di lavoro lo farà più lento e consumano più spazio utilizzare apache POI 3.17 beta-1

SXSSFWorkbook workbook = new SXSSFWorkbook(100); 
workbook.setCompressTempFiles(true); 
Sheet sh = workbook.createSheet(); 
//write your data on sheet 

//below code will download file in browser default download folder 
response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "attachment; filename="+filename+".xlsx"); 
      workbook.write(response.getOutputStream()); 
      workbook.close(); 
      workbook.dispose(); 

per PDF Usa itext

 Document document = new Document(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      PdfWriter.getInstance(document, baos); 
      document.open(); 
//write your code 

document.add("content"); 
      document.close(); 
      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0"); 
      response.setHeader("Pragma", "public"); 
      response.setContentType("application/pdf"); 
      response.addHeader("Content-Disposition", "attachment; filename="+filename+".pdf"); 
      response.setContentLength(baos.size()); 
      OutputStream os = response.getOutputStream(); 
      baos.writeTo(os); 
      os.flush(); 
      os.close(); 
Problemi correlati