Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    Generazione file excel (xls o csv)

    Ovunque si dice che per generare un file per Excel è sufficiente settare gli header...

    Codice PHP:
    $filename="nomefile.xls"
    header ("Content-Type: application/vnd.ms-excel"); 
    header ("Content-Disposition: inline; filename=$filename"); 
    e poi creare la semplice tabella in HTML.

    Il problema è che invece di chiedermi di salvare il file mi apri semplicemente la pagina con la tabella.
    La pagina che genero prende i dati dal database e crea la tabella ed è così strutturata:

    Codice PHP:
    $filename="nomefile.xls"
    header ("Content-Type: application/vnd.ms-excel"); 
    header ("Content-Disposition: inline; filename=$filename"); 
    ...
    <
    table>
      <
    thead>
        <
    tr><td>titolo1</td><td>titolo2</td><tr>
      </
    thead>
      <
    tbody>
        <
    tr><td>record1</td><td>record2</td><tr>
        <
    tr><td>record3</td><td>record3</td><tr>
      </
    tbody>
    </
    table
    La pagina viene visualizzata sul browser correttamente ma mi aspettavo la finestra di dialogo per scaricare il file in locale.

    Testato su: Firefox 4.0, IE9, Chrome 10

    Dove sbaglio?
    grazie

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Codice PHP:
    header("Content-Disposition: attachment; filename=\"$filename\" ); 
    Prova così

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Esatto, quello corregge il fatto di scaricarlo e non visualizzarlo.

    Ora ho altri problemi:

    con quella intestazione se genero un file .xls all'apertura excel 2010 mi da questo avviso:

    "Il formato del file che si sta cercando di aprire è diverso da quello specificato nell'estensione del file...Aprire il file ora?"

    Aprendolo è tutto corretto, intestazioni e dati.

    Ma perchè mi restituisce questo avviso?

    Ho provato anche altri header:

    Codice PHP:
    header("Content-Type: application/text");
    header("Content-type: text/x-csv");
    header("Content-type: text/csv");
    header("Content-type: application/csv");
    header ("Content-Type: application/vnd.ms-excel"); 
    Ma il risultato è lo stesso.

    Qual è l'header corretto per creare un file in .xls?
    Eventualmente posso optare per esportare i dati in .csv dato che non penso che in excel poi la lettura cambi molto.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Inoltre ho visto che si potrebbe sia esportare direttamente da MySQL

    Codice PHP:
    ...
    INTO OUTFILE ‘/tmp/result.txt’
    FIELDS TERMINATED BY ‘
    ,’ OPTIONALLY ENCLOSED BY ‘”‘
    LINES TERMINATED BY ‘
    \n’
    ... 
    oppure utilizzare fputcsv()

    ma in entrambi i casi il file verrebbe salvato sul server (dico giusto oppure ho capito male?), mentre io voglio che venga direttamente scaricato.

  5. #5
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    se il problema dell'avviso è importante, prova a guardare i risultati di questa ricerca su google, forse trovi qualche spunto interessante per avere un file "totalmente corretto"

    Risultati

    Ciao!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Allora alla fine ho optato per un file .csv. Ho cercato un bel po' su internet e ci sono pareri discordanti sul tipo di MIME da usare, sul separatore, sui doppi apici ecc. comunque ho sfornato questa procedura che funziona correttamente sui 3 browsers indicati ed Excel li apre correttamente:

    Codice PHP:
    // Testata
    $tot_campi mysql_num_fields($result);
           
    for(
    $i 0$i $tot_campi$i++ ) {
        
    $tabella .= '"'.mysql_field_name($result,$i).'";';
    }
        
    $tabella .= "\n";
            
    // Corpo
    while($row mysql_fetch_row($result)){
                
        foreach(
    $row as $value) {
                
            
    $tabella .= '"'.$value.'";';
        }
                
        
    $tabella .= "\n";
    }
            
    $nome_file "nome_file.csv"
            
    header("Content-Type: text/csv");
    header("Content-Disposition: attachment; filename=$nome_file");
            
    print 
    "$tabella";
            
    exit; 
    Come vedete metto i campi tra i doppi apici così anche in caso sia vuoto o null non ci sono problemi e separo i valori con il punto e virgola (utilizzato come separatore in Italia dato che la virgola è utilizzata per separare i decimali).
    Inoltre il Content-Type corretto sembra essere: text/csv (il condizionale è d'obbligo in quanto ho visto più di un parere discordante in merito).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.