Il presente script intende mostrare come sia possibile personalizzare un file Excel in base alle caratteristiche desiderate e popolarlo con i dati provenienti
da una base di dati precedentemente creata.
Il principale valore aggiunto del sistema proposto consiste nella possibilità
di effettuare una personalizzazione completa del file Excel, definendone in funzione delle nostre esigenze tutti i minimi dettagli, compresi un "intestazione" e un "piè di pagina" dinamici.
Sinteticamente, il file excel costruito sarà un template vuoto che in un secondo momento potrà essere popolato con i dati provenienti da un database.
Nell'esempio di seguito illustrato il file Excel prodotto conterrà la
nostra rubrica clienti.
Per chiarire al meglio le modalità di realizzazione del sistema abbiamo
suddiviso la procedura da seguire in una serie di punti:
1) innanzitutto occorre costruire un file Excel con tutte le caratteristiche
desiderate, comprensivo quindi di "intestazione" e "piè di pagina". Nell'intestazione inseriremo, centrando il testo, la dicitura "ELENCO CLIENTI: [clienti_totale]".
Il "corpo" deve essere riempito inizialmente soltanto dal titolo del foglio di lavoro e dall'intestazione della tabella stessa. Al posto delle righe inseriremo esclusivamente la dicitura "[clienti]".
Chiariremo successivamente come "trattare" queste stringhe, apparentemente senza significato.
Il modello del file, denominato "modello_excel.xls" è disponibile tra
i file della demo.
2) per agire all'interno del file Excel in piena autonomia è necessario
convertirlo in file di testo. Per far ciò è necessario eseguire un duplice passaggio:
a) salvare il file "modello_excel.xls" come pagina Web, così come indicato nella figura sottostante, e denominarlo "modello_excel.htm".
b) successivamente rinominare il file "modello_excel.htm" in "modello_excel.txt". Nella demo fornita sono presenti tutti e tre i file utilizzati nei passaggi descritti.
3) Aprendo il file .txt dobbiamo necessariamente effettuare qualche piccolo
aggiustamento in modo che l'elaborazione dinamica che costruiremo a breve si adatti in maniera perfetta alle caratteristiche del nostro file Excel. La procedura da seguire è la presente:
a) aprire il file "modello_excel.txt" e fare in modo che la parte finale del file, quella che contiene la dicitura "[clienti]", non sia racchiusa da alcuna tabella. Ecco un estratto della parte finale del file "modello_excel.txt" così come dove apparire e come riportato nel file in allegato:
<tr height=17 style='height:12.75pt'>
<td height=17 class=xl25 width=75 style='height:12.75pt;width:56pt'>ID</td> <td class=xl26 width=145 style='width:109pt'>COGNOME</td> <td class=xl26 width=145 style='width:109pt'>NOME</td> <td class=xl26 width=355 style='width:266pt'>INDIRIZZO</td> <td class=xl26 width=110 style='width:83pt'>CITTA'</td> <td class=xl26 width=110 style='width:83pt'>TELEFONO</td> </tr> [clienti] </table> |
b) salvare le modifiche apportate al file e chiuderlo.
Il database
Il database utilizzato contiene una sola tabella, tClienti, i cui campi sono caratterizzati come segue:
cliente_id: contatore dei clienti
cliente_nome: nome del cliente
cliente_cognome: cognome del cliente
cliente_indirizzo: indirizzo del cliente
cliente_citta: città del cliente
cliente_telefono: telefono del cliente
Gli script necessari al funzionamento del sistema creato, sono racchiusi all'interno di tre pagine .asp.
La prima pagina, common.asp, oltre alla connessione al database contiene la sub routine listaClientiOutput che fornisce in output (tramite la dichiarazione byRef) un array bidimensionale con le informazioni richieste per ogni categoria e la funzione genera() per la generazione di un numero casuale impiegato per nominare il file Excel.
La seconda pagina, default.asp (che costituisce la pagina da lanciare) apre inizialmente il file "modello_excel.txt", lo rinomina, per mezzo della funzione genera() e modifica l'estensione in .xls. Lo script sottostante racchiude quanto descritto:
'Nome temporaneo del file Excel
temp_excel_file = lcase(genera(91, 48, 5)) '5 = numero caratteri di cui è composta
Set fs = CreateObject("Scripting.FileSystemObject")
path_modello = server.mappath("public/modello_excel.txt")
path_temp = server.mappath("public/"& temp_excel_file &".xls")
Set a = fs.OpenTextFile(path_modello)
file_letto = a.readall
a.Close
La seconda parte della pagina si occupa di creare il corpo della tabella, scorrendo l'array bidimensionale listaClientiOutput contenente tutte le informazioni dei clienti.
Il contenuto della tabella verrà definito mediante la creazione di una
stringa ricorsiva, come indicato di seguito.
tabella_clienti = ""
clienti_totale = 0
if IsArray(listaClientiOutput) then
clienti_totale = Ubound(listaClientiOutput,2)
For risultato = 0 to clienti_totale
tabella_clienti = tabella_clienti & "<tr style=""vertical-align:middle;"">"
tabella_clienti = tabella_clienti & "<td
style=""text-align:center;border:.5pt solid;"">"&
listaClientiOutput(0,risultato) &"</td>"
tabella_clienti = tabella_clienti & "<td
style=""border:.5pt solid;"">"& listaClientiOutput(1,risultato)
&"</td>"
tabella_clienti = tabella_clienti & "<td
style=""border:.5pt solid;"">"& listaClientiOutput(2,risultato)
&"</td>"
tabella_clienti = tabella_clienti & "<td
style=""border:.5pt solid;"">"& listaClientiOutput(3,risultato)
&"</td>"
tabella_clienti = tabella_clienti & "<td
style=""border:.5pt solid;"">"& listaClientiOutput(4,risultato)
&"</td>"
tabella_clienti = tabella_clienti & "<td
style=""border:.5pt solid;"">"& listaClientiOutput(5,risultato)
&"</td>"
tabella_clienti = tabella_clienti & "</tr>"
Next
end if
Dopo avere effettuato le operazioni descritte andremo a sostituire alla stringa "[clienti]" contenuta nel file .txt usato come modello la nuova variabile contenente tutto il testo della tabella.
Contestualmente renderemo dinamica anche l'intestazione "[clienti_totale]": mediante la variabile clienti_totale+1 è possibile indicare in cima al foglio Excel prodotto il numero di record restituiti dalla query:
'Scrive sul file di testo il nuovo valore
Set a = fs.CreateTextFile(path_temp, True)
file_letto = replace(file_letto, "[clienti_totale]", clienti_totale+1)
file_letto = replace(file_letto, "[clienti]", tabella_clienti)
a.write (file_letto)
a.Close
set fs = nothing
Scritto sul server il nuovo file Excel non rimane che visualizzarlo. Abbiamo
scelto la tecnica del "download forzato" presente tra gli script di freeASP.html.it.
Il nome del file viene passato in querystring e, dopo che è stato richiamato dalla pagina download.asp, viene richiesto di aprirlo nella finestra corrente oppure di salvarlo su disco.