domenica 4 dicembre 2011

Java generare un excel da una servlet

Tipicamente si richiede di esportare in formato excel o pdf dati provenienti da liste presenti a front end.
Una soluzione automatica e veloce per questo è utilizzare la libreria dispay tag.
Se però le richieste sono più articolate è necessario utilizzare librerie ad hoc.
Nell'esempio seguente  ci sono due liste diverse di dati (libri e persone) e si vuole vederle raggruppate in un unico excel.

In questo esempio vediamo come generare un excel con, sullo stesso foglio, prima i dati di una lista e poi dell'altra, frapponendo tra le due liste una riga vuota.
Per farlo ho utilizzato le librerie di Apache POI, già viste in altri post.

Il metodo doPost della servlet è il seguente:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try
        {
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=\""
                        + "export.xls" + "\"");
            ServletOutputStream out = response.getOutputStream();
            HSSFWorkbook wb=getExcel();
            wb.write(out);
            out.close();
        }
        catch(Exception ex){
            ex.printStackTrace();       
        }   
    }


L'oggetto HSSFWorkbook è così creato:

    private HSSFWorkbook getExcel() throws Exception{
        HSSFWorkbook workbook = new HSSFWorkbook();
        // qui si caricano i dati (es. da db) delle due liste persone e libri
        List<Persona> persone=getPersone();
        List<Libro> libri=getLibri();
        HSSFSheet firstSheet = workbook.createSheet("LISTE");
        // riga intestazione prima lista
        HSSFRow rowA = firstSheet.createRow(0);
        HSSFCell cellA = rowA.createCell(0);
        cellA.setCellValue(new HSSFRichTextString("Nome"));
        HSSFCell cellB = rowA.createCell(1);
        cellB.setCellValue(new HSSFRichTextString("Cognome"));
        HSSFCell cellC = rowA.createCell(2);
        cellC.setCellValue(new HSSFRichTextString("Eta'"));
        int i=1;
        for(Persona p:persone){
            HSSFRow riga=firstSheet.createRow(i);
            HSSFCell cellaNome=riga.createCell(0);
            cellaNome.setCellValue(new HSSFRichTextString(p.getNome()));
            HSSFCell cellaCognome=riga.createCell(1);
            cellaCognome.setCellValue(new HSSFRichTextString(p.getCognome()));
            HSSFCell cellaEta=riga.createCell(2);
            cellaEta.setCellValue(new HSSFRichTextString(String.valueOf(p.getEta())));
            i++;
           
        }
        // riga vuota
        HSSFRow rigaVuota=firstSheet.createRow(i);
        i++;
        // riga intestazione nuova lista
        HSSFRow rowLibro = firstSheet.createRow(i);
        HSSFCell cellAutore = rowLibro.createCell(0);
        cellAutore.setCellValue(new HSSFRichTextString("Autore"));
        HSSFCell cellTitolo = rowLibro.createCell(1);
        cellTitolo.setCellValue(new HSSFRichTextString("Titolo"));
        HSSFCell cellPrezzo = rowLibro.createCell(2);
        cellPrezzo.setCellValue(new HSSFRichTextString("Prezzo"));
        HSSFCell cellCodice = rowLibro.createCell(3);
        cellCodice.setCellValue(new HSSFRichTextString("Codice"));
        i++;
        for(Libro l:libri){
            HSSFRow riga=firstSheet.createRow(i);
            HSSFCell cellaAutore=riga.createCell(0);
            cellaAutore.setCellValue(new HSSFRichTextString(l.getAutore()));
            HSSFCell cellaTitolo=riga.createCell(1);
            cellaTitolo.setCellValue(new HSSFRichTextString(l.getTitolo()));
            HSSFCell cellaPrezzo=riga.createCell(2);
            cellaPrezzo.setCellValue(new HSSFRichTextString(formattaDouble(l.getPrezzo())));
            HSSFCell cellaCodice=riga.createCell(3);
            cellaCodice.setCellValue(new HSSFRichTextString(l.getCodice()));
            i++;
           
        }
       
        return workbook;
    }
    private String formattaDouble(double d){
        NumberFormat nf=NumberFormat.getCurrencyInstance(Locale.ITALY);
        nf.setCurrency(Currency.getInstance(Locale.ITALY));
        return nf.format(d);
    }

Nessun commento:

Posta un commento