[PHP] come esportare due tabelle in file excel su due fogli distinti

Discussione in 'PHP' iniziata da samurai.sette, 24 Gennaio 2019.

  1. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    192
    Mi Piace Ricevuti:
    5
    Punteggio:
    18
    Ciao a tutti.
    Come da titolo avrei la necessità di esportare due tabelle mysql in un solo file excel. La prima tabella deve essere esportata nel Foglio1 e la seconda nel Foglio2. Ovviamente il tutto deve avvenire tramite codice PHP.
    Per estrarre una sola tabella scrivo un codice tipo questo:
    PHP:
    $con = new MySQLi('host''user''pass''database');
    $query "SELECT colonna1, colonna2 FROM tabella ORDER BY id";
    $result $con -> query($query);
    for (
    $i 0$i <= mysqli_num_fields($result); $i++)
    {
        
    $info_col mysqli_fetch_field($result);
        
    $nomi_col $info_col -> name;
        echo 
    $info_col -> name "\t";
    }
    $set_data '';
    while (
    $row mysqli_fetch_row($result))
    {
        
    $row_data '';
        foreach (
    $row as $value)
        {
            
    $value '"' str_replace ('.',',',$value) . '"' ."\t";
            
    $row_data .= $value;
        }
        
    $set_data .= trim ($row_data) . "\n";
    }
        
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=Monitoraggio.xls"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
     
    echo 
    "\n" $set_data "\n";
    Come potrei fare per esportare due tabelle nel modo in cui ho scritto prima?
    Ciao, grazie mille a tutti.
     
  2. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.518
    Mi Piace Ricevuti:
    123
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    vedi qui se ti può essere utile
    https://www.mysql.com/why-mysql/windows/excel/
     
  3. fratt

    fratt Nuovo Utente

    Registrato:
    19 Gennaio 2019
    Messaggi:
    33
    Mi Piace Ricevuti:
    4
    Punteggio:
    8
    Occupazione:
    Dilettante
  4. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    920
    Mi Piace Ricevuti:
    53
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
  5. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    192
    Mi Piace Ricevuti:
    5
    Punteggio:
    18
    Ciao ragazzi.
    Grazie mille per i consigli. Proverò le vostre soluzioni e vi farò sapere.
    Ciao!
     
  6. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    192
    Mi Piace Ricevuti:
    5
    Punteggio:
    18
    Ciao ragazzi, scusate se rispondo con un pò di ritardo ma il lavoro mi porta via un pò di tempo.
    Ho provato la libreria PhpSpreadsheet e devo dire che è molto ben fatta e semplice da usare. Nonostante questo ho un piccolo problemino e spero possiate aiutarmi a risolverlo.
    Della tabella contenente i dati da esportare in excel non conosco il numero delle colonne. Ipotizzando una tabella di 10 colonne per esportare i dati utilizzo questo codice che funziona correttamente:
    PHP:
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Excel multiplo</title>
    <?PHP
        
    require "vendor/autoload.php";
        use 
    PhpOffice\PhpSpreadsheet\Spreadsheet;
        use 
    PhpOffice\PhpSpreadsheet\Writer\Xlsx;
        
    $con mysqli_connect ("localhost","root","","database");
    ?>
    </head>
    <body>
    <form method="post">
    <input type="submit" name="excel" value="Estrai i dati in excel" />
    </form>
    <?PHP
        
    if (isset ($_POST['excel']))
        {
            
    // estraggo i nomi delle colonne
            
    $query_nomi mysqli_query ($con"SHOW COLUMNS FROM tabella");
            while (
    $result_nomi mysqli_fetch_array($query_nomi))
            {
                
    $nomi_colonne[] = $result_nomi[0];
            }
            
    // calcolo il numero delle colonne
            
    $query_dati mysqli_query ($con"SELECT * FROM tabella ORDER BY id");
            
    $num_colonne mysqli_num_fields ($query_dati);
            
    // creo un foglio excel
            
    $excel = new SpreadSheet();
            
    $foglio $excel -> getActiveSheet();
            
    // compongo la tabella excel
            
    $num_riga 2;
            
    // Inserisco i nomi delle colonne nella prima riga
            
    for ($i=1$i<$num_colonne$i++)
            {
                
    $lettera_col chr($i 64); // lettera della colonna della tabella (A,B,C,D,ecc.)
                
    $num_riga1_excel $alfabeto "1"// cella A1,B1,C1,D1,ecc.
                // inserisco nel primo rigo i nomi delle colonne
                
    $foglio -> setCellValue($num_riga1_excel$nomi_colonne[$i]);
                
    // inserisco i dati della tabella
                
    while ($row mysqli_fetch_array($query_dati))
                {
                    
    $foglio -> setCellValue('A'.$num_riga,$row[1]);
                    
    $foglio -> setCellValue('B'.$num_riga,$row[2]);
                    
    $foglio -> setCellValue('C'.$num_riga,$row[3]);
                    
    $foglio -> setCellValue('D'.$num_riga,$row[4]);
                    
    $foglio -> setCellValue('E'.$num_riga,$row[5]);
                    
    $foglio -> setCellValue('F'.$num_riga,$row[6]);
                    
    $foglio -> setCellValue('G'.$num_riga,$row[7]);
                    
    $foglio -> setCellValue('H'.$num_riga,$row[8]);
                    
    $foglio -> setCellValue('I'.$num_riga,$row[9]);
                    
    $num_riga++;
                }
            }
            
    $writer = new Xlsx($excel);
            
    $writer -> save('dati.xlsx');       
        }
    ?>
    </body>
    </html>
    Inizialmente avevo pensato di scrivere il codice in questa maniera:
    PHP:
    // compongo la tabella excel
    $num_riga 2;
    // Inserisco i nomi delle colonne nella prima riga
    for ($i=1$i<$num_colonne$i++)
    {
        
    $alfabeto chr($i 64); // LETTERA COLONNA (A,B,C,D,...)
        
    $num_riga1_excel $alfabeto "1"// CELLA A1,B1,C1,D1,...
        
    $foglio -> setCellValue($num_riga1_excel,$nomi_colonne[$i]);
        
    // ESTRAGGO I DATI DALLA TABELLA
        
    while ($row mysqli_fetch_array($query_dati))
        {
            
    $foglio -> setCellValue($alfabeto $num_riga,$row[$i]);
            
    $num_riga++;
        }
    }
    Ma facendo in questo modo mi esporta in maniera corretta soltanto i nomi delle colonne e i dati della prima colonna.
    Secondo voi dove sbaglio?
    Ciao, grazie mille
     
  7. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    920
    Mi Piace Ricevuti:
    53
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    Senza complicarsi la vita puoi utilizzare "fromArray".... fai prima
    PHP:
    require 'vendor/autoload.php';

    use 
    PhpOffice\PhpSpreadsheet\Spreadsheet;
    use 
    PhpOffice\PhpSpreadsheet\Writer\Xlsx;

    /************************************
    * FAKER
    */
    function make_faker($len,$ar,$data){

       if(
    strlen($data)<$len){
          
    shuffle($ar);
          
    $data.=$ar[0];
          return 
    make_faker($len,$ar,$data);
       }
       return 
    $data;
    }
    function 
    make_fake_data(){
       
    $model=[];
       
    $alpha=range('a','z');
       
    $num=range(0,9);
       
    $alnum=array_merge($alpha,$num);
       
    $intestazioni=['nome','cognome','test1','test2','test3'];
       for(
    $i=0;$i<255;$i++){
          
    //ipotizzando di avere un modello del tipo : Nome Cognome test1 test2 ..... etc
          
    $local=[];
          foreach (
    $intestazioni as $items){
             
    $local[$items]=make_faker(rand(5,15),$alpha,'');
          }
          
    $model[]=$local;
       }

       return 
    $model;
    }
    /*********************************************END FAKER */
    $simulazione_dati=make_fake_data();
    //prelevo le intestazioni dei dati
    $header=array_keys($simulazione_dati[0]);
    $spreadsheet = new Spreadsheet();
    $spreadsheet->setActiveSheetIndex(0);
    $activeSheet $spreadsheet->getActiveSheet();
    //stampo partendo da A1 le intestazioni dei dati
    $activeSheet->fromArray(array_values($header));
    foreach (
    $simulazione_dati as $k=>$items){
       
    //devo aggiungere 2 a K perchè parte da 0
       // T0 = A1 ~ K = 0 (+2) = A2
       // T1 = A2 ~ K = 1 (+2) = A3
       
    $data='A'.($k+2);
       
    $activeSheet->fromArray(array_values($items),NULL,$data);
    }
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="myfile.xlsx"');
    header('Cache-Control: max-age=0');

    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
     
  8. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    192
    Mi Piace Ricevuti:
    5
    Punteggio:
    18
    Ciao Macus_adi. Grazie per la risposta.
    Ho provato la tua soluzione ma quando mi genera il file excel i nomi delle colonne sono generate in maniera corretta mentre i dati di chiascuna colonna vengono generati in maniera anomala.
    Ad esempio la colonna "id" ha valori che va da 1 a 260; nella colonna "id" del file excel non leggo 1-2-3-4-ecc. ma leggo kjhdkuhd, kdghkdhkd,klhihjlk,lkhjdidji, ecc. Stessa cosa per tutte le altre colonne.
    Mi sapresti dire come mai?
    Ciao e grazie mille.
     
  9. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    920
    Mi Piace Ricevuti:
    53
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    Se hai copiato e incollato il mio codice certo, per creare il "modello" ho gestito il tutto con due funzione FAKER, infatti:
    Nota: "make_fake_data()"-> crea dati fittizi....
    per utilizzarlo correttamente :
    PHP:
    $simulazione_dati=mysqli_fetch_all(MYSQLI_ASSOC);
    Quindi cambiando lo la variabile "simulazione_dati" hai il risultato sperato!
     
Sto caricando...

Condividi questa Pagina