Home
Produrre un file Excel da una JSP

19 Settembre 2002

Produrre un file Excel da una JSP

di

A partire da un'applicazione Server Side è possibile produrre al volo qualsiasi tipo di formato, anche binario e fare in modo che sul client sia gestito nel modo opportuno

Supponiamo di avere un’applicazione web che visualizza la lista dei movimenti di un conto corrente bancario. È possibile fornire all’utente svariate tipologie di funzionalità: ordinamenti, filtri, opzioni di visualizzazione ecc.

Una di queste potrebbe essere la possibilità di scaricare dal server dell’applicazione un file in formato Excel contenente i dati selezionati attraverso i criteri di filtro e di ordinamento.

Per ottenere questo risultato esistono metodi differenti.

Il primo, e meno efficace, consiste nell’avere una componente server che, a partire dai parametri dell’utente generi un file in formato excel sul file system dell’application server. Questo file conterrà naturalmente i dati che l’utente si aspetta di ricevere, ma dopo la produzione ci si aspetta che il file venga scaricato dall’utente, pertanto è necessario reindirizzare il browser verso l’URL del file appena generato per permetterne il download.

Il secondo metodo, che è quello che prediligo, consiste del trasformare direttamente il contenuto dello stream di output generato dalla pagina web dinamica, cioè la response HTTP, per fare in modo che il browser creda di trovarsi di fronte ad un documento differente dal classico testo che in realtà gli passeremo e provveda ad aprirlo con l’applicazione giusta. Nel caso specifico proveremo a produrre un file di testo separato da tabulazioni e convinceremo il browser che si tratta di un vero e puro file in formato XSL, cioè un documento Excel.

Per prima cosa è necessario sapere che la response HTTP è dotata dell’attributo Content-Type, deputato a descrivere il contenuto di quanto viene spedito al client, in particolare quello che viene descritto è il MIME Type.

Per tutte le pagine web statiche e per le applicazioni server-side che generano un tradizionale output HTML il Content-Type è lo standard text/html.

Quando il browser riceve una response che ha l’attributo Content-Type fissato al valore text/html è in grado di gestirlo autonomamente e di impaginare il contenuto di quanto ricevuto secondo le specifiche di rendering proprie del formato.

Lo stesso accade quando riceve una response che è in grado di gestire direttamente, come ad esempio accade per i formati:

text/css
text/plain
image/gif
image/jpg
image/png
audio/x-wav

/

Quando invece riceve una response che non è in grado di gestire in maniera autonoma viene ricercata l’applicazione deputata alla gestione e, dopo aver ottenuto l’autorizzazione da parte dell’utente, questa viene aperta per visualizzare il contenuto ricevuto via HTTP.

I tipi MIME che di solito il browser non è in grado di gestire autonomamente sono, ad esempio, i seguenti:

application/msword
application/octect-stream
application/pdf
application/postcript
application/vnd.ms-excel
ecc…

/

Per convincere il browser, quindi, che il flusso che gli stiamo trasmettendo è un file in formato Excel, non dobbiamo far altro che modificarne opportunamente il Content-Type settando il tipo MIME al valore application/vnd.ms-excel.

Per fare questo esistono molti modi, almeno uno per ogni linguaggio di scripting server side. Non esistono infatti linguaggi che non permettano di modificare le caratteristiche della response HTTP.

Per comodità e per abitudine scriveremo l’esempio utilizzando Java all’interno di una pagina JSP.

Ecco il codice della pagina JSP:

Banca di Paperopoli
Conto Corrente numero: 1234567890
Valuta: Euro
Lista movimenti generata il: 19/09/2002

Saldo precedente 50000
avere dare
10/09/2002 bonifico a vostro favore PincoPallo S.p.a. 1000
11/09/2002 pagamento tramite POS pos num. 12345656 500
12/09/2002 rata mutuo 3000
12/09/2002 pagamento tramite POS pos num. 6543 1500
13/09/2002 pedaggio autostradale 1500

Saldo attuale 47500
<%@page contentType="application/vnd.ms-excel" %>

/

Salviamo il contenuto nel fileestrattoconto.jsp e salviamolo all’interno della nostra ormai consueta directory [Tomcat_dir]webappsapogeo in modo da poterla referenziare direttamente attraverso una chiama HTTP all’url: http://localhost:8080/apogeo/estrattoconto.jsp

Ed ecco il risultato visualizzato dal client

Come si può vedere ci sono due fattori che contano, il primo è senza dubbio la presenza della direttiva:
<%@page contentType="application/vnd.ms-excel" %>

Obiettivo di tale direttiva JSP è proprio quello di alterare il MME type della response della chiamata HTTP in essere tra client e server.

Il secondo fattore è legato direttamente al formato del file scelto per l’esempio, cioè il foglio Excel.

Come sappiamo è possibile aprire in Excel un qualunque file di testo, l’applicazione penserà a cercare di interpretarne il contenuto utilizzando la regola che l’utilizzo del carattere di tabulazione corrisponde alla separazione tra le colonne.

Nella generazione dell’output della JSP, pertanto, è bene tener presente questa regola per ottenere il risultato di avere i dati nelle colonne giuste e non in maniera disorganizzata.

Il metodo che abbiamo visto si adatta più o meno a tutti i formati dei file per i quali siamo in grado di produrre uno stream, certo per i formati binari le cose si complicano leggermente, ma è possibile ottenere effetti particolari come, ad esempio, dei grafici a runtime in funzione di dati calcolati applicativamente.

Con strumenti di questo genere l’unico limite è la vostra fantasia, o quella dei vostri clienti.

L'autore

  • Massimo Canducci
    Massimo Canducci vanta oltre 25 anni di esperienza nel campo dell'innovazione e della digital transformation ed è Chief Innovation Officer per Engineering Ingegneria Informatica. È docente alla Singularity University, l'Università di Torino e l'Università di Pavia, e insegna in master MBA.

Iscriviti alla newsletter

Novità, promozioni e approfondimenti per imparare sempre qualcosa di nuovo

Immagine decorativa form newsletter
Gli argomenti che mi interessano:
Iscrivendomi dichiaro di aver preso visione dell’Informativa fornita ai sensi dell'art. 13 e 14 del Regolamento Europeo EU 679/2016.