Esportare tabelle di Excel in un documento HTML

Ultima modifica: 29-05-2016

In alternativa al copia ed incolla che di solito si usa per trasportare una tabella Excel in un foglio HTML presento questa soluzione che ho trovato in internet.

Con la procedura da me modificata si crea o aggiorna una pagina HTML con dati provenienti da un foglio di Excel.

Preparazione del lavoro

  1. In Esplora risorse creiamo una cartella dedicata a questo lavoro ed una sottocartella denominata html
  2. In una Cartella di Excel prepariamo tutte le tabelle che vogliamo. Non importa in quale numero o in quale posizione. Trattiamo le tabelle come più ci aggrada: inserimento manuale dei dati, calcoli, inserimento dei dati tramite codice VBA, ecc
  3. Salviamo la Cartella di Excel nella cartella precedentemente preparata
  4. Preparare una pagina HTML con tutto quello che serve (la pagina di origine che chiameremo pagina_base.html la pagina di origine ): Stili CSS, Javascript, contenuti, eccetto la tabella
  5. Là dove occorre inserire le tabelle di Excel è sufficiente mettere, nel codice della pagina, questa riga come segnaposto per ogni tabella che da Excel si vuole trasferire:
    <!---- Crea prima tabella --->
    <!---- Crea seconda tabella --->
    ecc.
  6. Salviamo la pagina HTML nella cartella html e le assegnamo il nome pagina_base.html

ATTENZIONE:

Questa pagina (la pagina di origine) non sarà quella che andremo a postare nel sito o che comunque vorremo utilizzare, ma quella che useremo per creare la pagina vera e propria. La pagina da postare nel sito, o che, comunque, dovremo usare alla fine, sarà quella generata da questa procedura ed in questa circostanza verrà chiamata tabella.html.

 

Per vedere il codice HTML della pagina pagina_base.html eseguite clic destro del mouse sulla pagina e dal menù di scelta rapida scegliete, a seconda del browser che usate, "Visualizza pagina sorgente" (FF) oppure "HTML" (IE) oppure "Sorgenti" (Opera) oppure "View source" (Safari).

A questo punto possiamo dedicarci al codice VBA.

 

Creazione del codice per creare o aggiornare una pagina HTML

Compiute le operazioni preliminari, possiamo dedicarci al codice VBA (ALT + F11 per andare in VBA)

Il lavoro che ci aspettiamo da questo codice si può sintetizzare in queste azioni.

  1. Vengono usati due differenti canali, uno per la lettura del file di origine ed uno per la scittura sul file di destinazione. Le due operazioni, in questo caso, vengono eseguite contemporaneamente.
  2. usando il primo canale leggiamo una riga dal file di origine
    se il file di destinazione non esiste, viene creato, se il file di destinazione esiste, viene sovrascritto
  3. usando il secondo canale scriviamo la riga appena letta nel file di destinazione
  4. prima di scrivere sul file di destinazione dobbiamo tuttavia eseguire un controllo sulla riga appena letta:
    • se la riga letta è uguale a "<!---- Crea prima tabella --->" o a "<!---- Crea seconda tabella --->" o simili ci spostiamo sulla cartella Excel e cominciamo a scrivere la tabella di Excel nel file di destinazione
    • in caso contrario provvediamo a scrivere sul file di destinazione la riga letta dal file di origine

Passiamo ora ad esaminare il codice da usare.

per aprire i due canali di comunicazione coi due files, il file di origine per la lettura, il file di destinazione per la scrittura:

FileNum1 = FreeFile
Open Html_path & PaginaBase For Input As FileNum1 ' PaginaBase è il file da cui si leggono le informazioni
FileNum2 = FreeFile
Open Html_path & FileOut For Output As FileNum2 ' FileOut è il file sul quale si va a scrivere

per leggere dal file di origine uso:

Line Input #FileNum1, DataLine ' in DataLine viene memorizzata la linea letta

mentre per scrivere nel file di destinazione eseguo il comando:

Print #FileNum2, DataLine

Ma prima di compiere questa operazione debbo eseguire un controllo.

Se in DataLine è memorizzata la stringa "<!---- Crea prima tabella --->" oppure <!---- Crea seconda tabella ---> o altre di questo genere piazzate come segnaposti nel file di origine, mi sposto sul foglio di Excel e comincio a leggere la tabella interessata ed a copiarla nel file di destinazione creandoci una tabella per ospitarvi i dati.

Questa operazione la vedremo nel listato completo.

 

Ora il codice

Se in VBA ancora non esiste, inseriamo un modulo standard (clic destro nella finestra Progetto - VBAProject e scegliamo dal menù a tendina la voce: Inserisci ---> Modulo).

Nel modulo standard del VBA scriviamo queste due routines:

 

Sub RiscriviTabella()
Dim MiaCartella, PaginaBase, FileOut, Html_path
Dim FileNum1 As Integer, FileNum2 As Integer
Dim DataLine
Dim Intervallo As Range
' la cartella dove sto lavorando
MiaCartella = ActiveWorkbook.Path
' la cartella delle pagine HTML
Html_path = MiaCartella & "\html\"
' questa è la pagina di origine
PaginaBase = "pagina_base.html"
' questa è la pagina di destinazione
FileOut = "tabella.html"
' cerco il primo canale libero per comunicare con la pagina di origine
FileNum1 = FreeFile
' apro in lettura la pagina di origine
Open Html_path & PaginaBase For Input As FileNum1
' cerco il secondo canale di comunicazione con la pagina di destinazione
FileNum2 = FreeFile
' apro in scrittura la pagina di destinazione
Open Html_path & FileOut For Output As FileNum2
' inizio la lettura del file di origine
Do While Not EOF(FileNum1)
Line Input #FileNum1, DataLine
' qui si decide se copiare quel che è stato letto dalla pagina di origine
' o se copiare la tabella di Excel
Select Case DataLine
Case "<!---- Crea prima tabella --->"
Set Intervallo = Worksheets("Foglio2").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Case "<!---- Crea seconda tabella --->"
Set Intervallo = Worksheets("Foglio1").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Case "<!---- Crea terza tabella --->"
Set Intervallo = Worksheets("Foglio3").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2
Case Else
Print #FileNum2, DataLine
End Select
Loop
' qui finisce il lavoro
Close (FileNum1)
Close (FileNum2)
FreeFile (FileNum1)
FreeFile (FileNum2)
If Err = 0 Then MsgBox "La Tabella è aggiornata ! ", vbInformation, "Tabella"
End Sub


' Questa Private Sub esegue la stampa delle tabelle se richiamata dalla routine sovrastante
' Per ogni tabella da stampare nella pagina di destinazione vengono passati, come argomenti,
' il nome della tabella ed il numero del canale di comunicazione col file di destinazione

Private Sub StampaTabella(Tabella As Range, Canale As Integer)
' si giunge a questa routine ogni volta occorra stampare la tabella
Dim MaxRighe, MaxColonne, Riga, Col, Valore
With Tabella
MaxRighe = .Rows.Count
MaxColonne = .Columns.Count
Print #Canale, "<table align=""center"" width=""90%"" border=""1"" cellspacing=""0"" cellpadding=""0"">"
For Riga = 1 To MaxRighe
Print #Canale, "<tr>";
For Col = 1 To MaxColonne
Print #Canale, "<td>";
Valore = .Cells(Riga, Col).Text
If Valore <> "" Then
Print #Canale, Valore;
Else
Print #Canale, "&nbsp;";
End If
Print #Canale, "</td>"
Next
Print #Canale, "</tr>"
Next
Print #Canale, "</table>"
End With
End Sub

Perchè due routines? Semplicemente per risparmiare codice.

Ogni volta incontriamo la stringa <!---- Crea xxx tabella ---> dobbiamo spostarci sul figlio di Excel e copiare il contenuto delle celle nella pagina HTML. Le istruzioni sono molte e, se dovessimo ripeterle per ogni tabella che dobbiamo copiare, le dovremmo replicare ogni volta nella routine principale. In questo modo, invece, ogni volta che dobbiamo copiare una tabella è sufficiente recarci alla Private Sub StampaTabella(Tabella As Range, Canale As Integer) portando come argomenti il nome della tabella ed il numero del canale per scrivere nella pagina HTML, come si vede in questo frammento di codice:

Case "<!---- Crea prima tabella --->"
Set Intervallo = Worksheets("Foglio2").Range("A1").CurrentRegion
StampaTabella Intervallo, FileNum2

 

Una nota sul metodo usato con Istruzione Print #

In tutta la serie di istruzioni Print # usata nella Private Sub StampaTabella(Tabella As Range, Canale As Integer) noterete che alcune finiscono col ; (punto e virgola) altre senza alcuna punteggiatura.

Questo perchè l'istruzione Print # segue queste regole:

  1. Print # senza punteggiatura scrive il messaggio e torna a capo per la successione istruzione
  2. Print #; con il ; (punto e virgola) continua a scrivere sulla stessa riga e senza lasciare alcun spazio tra i vari dati
  3. Print #, con la , (virgola) continua a scrivere sulla stessa riga ma inserisce una tabulazione (una serie di carattri spazio)

Quindi, quando vogliamo che il testo da scrivere successivamente vada a capo, viene omessa la punteggiatura alla fine dell'istruzione, e quando vogliamo che il testo da scrivere successivamente rimanga sulla stessa riga, useremo la virgola o il punto e virgola a seconda dei casi.

 

Qui di seguito potrete scaricare il file usato per questo tutorial scaricare (dimensione file 29 KB)