Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2019
    Messaggi
    31

    Creazione tabella Excel da tabella php

    Buongiorno a tutti
    Ho un file php che, elaborando i dati inseriti in un form di un'altra pagina, mi genera una tabella con il risultato finale.
    Vorrei aggiungere un pulsante che mi permetta di salvare la sola tabella trasformandola in una tabella Excel.
    L'utente dovrà avere la possibilità di salvare in file in una qualsiasi cartella del pc a sua scelta e rinominare il file a suo piacimento, come per esempio "Preventivo-nomecliente-281019.xls"
    Premetto che ho cercato online ma non trovo nulla che faccia esattamente al caso mio.
    Voi avete qualche idea di come potrei fare?

    Grazie in anticipo
    Ultima modifica di Felotti; 28-10-2019 a 18:26

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2019
    residenza
    Sicilia
    Messaggi
    79
    Ciao,

    senza utilizzare librerie potresti farlo in maniera grezza inviando un paio di intestazioni al browser più la tabella HTML risultante.

    Es.

    Codice PHP:
    $filename "file.xls";
    header("Content-Type: application/vnd.ms-excel");
    header("Content-Disposition: inline; filename=".$filename); // Questa riga forza il download del file excel

    // Qui metti il codice che genera la tabella e la stampa a video 

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2019
    Messaggi
    31
    Purtroppo non ho modo di inserire le righe che mi hai mandato appena prima del codice che genera l'output, in quanto il tutto è contenuto all'interno di una classe.
    Se metto tutto all'inizio del file, come vedrai commentato all'inizio, mi fa salvare il file prima di entrare nella pagina dell'output e, inoltre, mi mette in excel tutta la pagina generata, con vari elementi fuori dalla tabella che non mi interessano.
    Ad ogni modo ciò che mi hai mandato funziona, bisogna solo capire dove inserirlo per adattarlo alla mia pagina.
    Ecco il codice per intenderci:
    codice:
    <html>
        <body background="immagine">
    
        <?php
        
            $user=$_POST['user'];
            /*$filename = $_POST['file'];
            header("Content-Type: application/vnd.ms-excel");
            header("Content-Disposition: inline; filename=".$user."-".$filename);*/
            
            class Goptimeze {
    
                public $mLen=5800;
    
                public $result=[];
    
                public $html='';
               
                public function CreateForm(){
                    if(empty($this->input->post())){
                        $this->load->view('CreateForm');
                    }else{
                        $this->load->view('ParseRequest',['data'=>$this->input->post('np')]);
                    }
                }
                public function parseRequest(){
                    $data=[];
                    foreach ($_POST['data'] as $k=>$v){
                            $v['len']+=10; //aggiungo 10mm per il taglio
                            $data[]=[$v['qta'],$v['len']]; //aggiungo all'array
                        }
                    echo $this->creaLen($data)->html;
                }
                
                public function __construct() {
                    ini_set('memory_limit',-1);
                }
                public function creaLen($data){
                    $bs=[];
                    foreach ($data as $k=>$v){
                        !isset($bs[$v[1]])?$bs[$v[1]]=$v[0]:$bs[$v[1]]+=$v[0];
                    }
                    krsort($bs);
                    $data=[];
                    foreach ($bs as $k=>$v){
                        $data[]=[$v,$k];
                    }
                    foreach ($data as $items){
                        $this->creaTravi($items);
                    }
                    $this->createOutput();
                    return $this;
                }
                public function creaTravi($data){
                    for($i=0;$i<$data[0];$i++){
                        if($this->findInPath($data))$this->findLocation($data[1]);
                    }
                }
                public function findInPath($data){
                    $num=$data[0];
                    $el=0;
                    foreach ($this->result as $k=>$v){
                        foreach ($v['values'] as $items){
                            if($items==$data[1])$el++;
                        }
                    }
                    if($el>=$num)return false;
                    else return true;
                }
                public function findLocation($len){
                    if(empty($this->result))$this->Trave($len);
                    else{
                        $loc=false;
                        foreach ($this->result as $k=>$v){
                            if(!$loc && $this->result[$k]['len']-$len>=0){
                               $this->result[$k]['values'][]=$len;
                               $this->result[$k]['len']-=$len;
                               $loc=true;
                            }
                        }
                        if(!$loc)$this->Trave($len);
                    }
                }
                public function Trave($in){
                    $this->result[]=['values'=>[$in],'len'=>$this->mLen-$in];
                }
    
                public function createOutput(){
                   $table='<table border="1" bgcolor="#ffffff" bordercolor="black">
                   <thead><tr><th>Verga</th><th>Elementi</th><th></th><th>N Pezzi</th><th></th><th>Sfrido</th></tr></thead><tbody></tbody>';
                   $all_t=0;
                   $sf=0;
                   foreach ($this->result as $k=>$v){
                        $table.='<tr><td>'.($k+1).'</td><td><ul>';
                        $all_t+=count($v['values']);
                        foreach ($v['values'] as $items){
                            $items-=10;
                            $table.='<li>'.$items.'</li>';
                        }
                        $table.='</ul></td><th></th><td>'.count($v['values']).'</td><th></th><td>'.$v['len'].'</td></tr>';
                        $sf+=$v['len'];
                    }
                    $table.='</tbody>';
                    $table.='<tfoot><tr><th>Verghe utilizzate: '.count($this->result).'</th>
                    <th></th><th>Pezzi tagliati : '.$all_t.'</th><th></th><th>Scarto totale : '.$sf.'</th><th><a href="CreateForm.php"><img src="home.jpg"></a></tr></tfoot>';
                    $table.='</table>';
                    return $this->html=$table;
                }
            }
            $res=new Goptimeze();
            $res->parseRequest();
        ?>
        <br>
        <?php
            echo "Eseguito da <b>$user</b>";
        ?>
            <div style="position: absolute; top:10px; right: 10px">
                <img src="immagine">
            </div>
            <div style="position: absolute; position:fixed; bottom:5px; right: 10px">            
                Produced by <a target="_blank" href="link"><font color="blue" size="3">nome</font></a> 
                for <a target="_blank" href="link"><font color="blue" size="3">azienda</font></a>
            </div>
        </body>
    </html>

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2019
    residenza
    Sicilia
    Messaggi
    79
    Le intestazioni vanno messe prima di qualsiasi output HTML.

    Scusa ma non si può vedere codice HTML e il codice di una classe PHP mischiati nello stesso file.

    Separa le due cose, in un file metti solo il codice della classe, mentre in un altro file metti in testa allo script le due intestazioni con header(), quindi richiami la classe e ti fai restituire il contenuto (nel tuo caso l'HTML) da un metodo.

    Devi solo fare un pò di ordine nel codice

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2019
    Messaggi
    31
    Ok quindi in un ulteriore file dovrò includere il file con la classe.
    Come faccio a farmi restituire il risultato di createOutput() in questo quarto file?
    E soprattutto come faccio a richiamarlo?
    Perchè provando come segue non ci sono riuscito
    codice:
    <html>
        <?php
            $filename = $_POST['file'];
            header("Content-Type: application/vnd.ms-excel");
            header("Content-Disposition: inline; filename=".$user."-".$filename);
            
            require_once('risultato.php');
            $html=$_POST['output'];
            $data=$_POST['data'];
            
            $res->parseRequest();
            $res=new Goptemize();
            
            echo $res;
        ?>
    
    </html>

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2019
    residenza
    Sicilia
    Messaggi
    79
    Ciao,

    quando dico "Le intestazioni vanno messe prima di qualsiasi output HTML." vuol dire che prima dell'istruzione PHP

    Codice PHP:
    header(); 
    non puoi mandare nulla in output, nemmeno una riga vuota (quindi nemmeno il tag <html>).

    Nel file PHP devono starci solamente istruzioni PHP, tutto l'HTML (compreso il tag html) te lo fai tornare dal metodo della classe e lo mostri a video dopo gli header.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2019
    Messaggi
    31
    Ok ho avuto tempo in questi giorni di correggere qualcosa e ora mi trovo in questa situazione:
    in risultato.php è presente la sola classe, ecco il codice:
    codice:
    <?php
            class Goptimeze {
    
                public $mLen=5800;
    
                public $result=[];
    
                public $html='';
               
                public function CreateForm(){
                    if(empty($this->input->post())){
                        $this->load->view('CreateForm');
                    }else{
                        $this->load->view('ParseRequest',['data'=>$this->input->post('np')]);
                    }
                }
                public function parseRequest(){
                    $data=[];
                    foreach ($_POST['data'] as $k=>$v){
                            $v['len']+=10; //aggiungo 10mm per il taglio
                            $data[]=[$v['qta'],$v['len']]; //aggiungo all'array
                        }
                    echo $this->creaLen($data)->html;
                }
                
                public function __construct() {
                    ini_set('memory_limit',-1);
                }
                public function creaLen($data){
                    $bs=[];
                    foreach ($data as $k=>$v){
                        !isset($bs[$v[1]])?$bs[$v[1]]=$v[0]:$bs[$v[1]]+=$v[0];
                    }
                    krsort($bs);
                    $data=[];
                    foreach ($bs as $k=>$v){
                        $data[]=[$v,$k];
                    }
                    foreach ($data as $items){
                        $this->creaTravi($items);
                    }
                    $this->createOutput();
                    return $this;
                }
                public function creaTravi($data){
                    for($i=0;$i<$data[0];$i++){
                        if($this->findInPath($data))$this->findLocation($data[1]);
                    }
                }
                public function findInPath($data){
                    $num=$data[0];
                    $el=0;
                    foreach ($this->result as $k=>$v){
                        foreach ($v['values'] as $items){
                            if($items==$data[1])$el++;
                        }
                    }
                    if($el>=$num)return false;
                    else return true;
                }
                public function findLocation($len){
                    if(empty($this->result))$this->Trave($len);
                    else{
                        $loc=false;
                        foreach ($this->result as $k=>$v){
                            if(!$loc && $this->result[$k]['len']-$len>=0){
                               $this->result[$k]['values'][]=$len;
                               $this->result[$k]['len']-=$len;
                               $loc=true;
                            }
                        }
                        if(!$loc)$this->Trave($len);
                    }
                }
                public function Trave($in){
                    $this->result[]=['values'=>[$in],'len'=>$this->mLen-$in];
                }
    
                public function createOutput(){
                   $table='<table border="1" bgcolor="#ffffff" bordercolor="black">
                   <thead><tr><th>Verga</th><th>Elementi</th><th></th><th>N Pezzi</th><th></th><th>Sfrido</th></tr></thead><tbody></tbody>';
                   $all_t=0;
                   $sf=0;
                   foreach ($this->result as $k=>$v){
                        $table.='<tr><td>'.($k+1).'</td><td><ul>';
                        $all_t+=count($v['values']);
                        foreach ($v['values'] as $items){
                            $items-=10;
                            $table.='<li>'.$items.'</li>';
                        }
                        $table.='</ul></td><th></th><td>'.count($v['values']).'</td><th></th><td>'.$v['len'].'</td></tr>';
                        $sf+=$v['len'];
                    }
                    $table.='</tbody>';
                    $table.='<tfoot><tr><th>Verghe utilizzate: '.count($this->result).'</th>
                    <th></th><th>Pezzi tagliati : '.$all_t.'</th><th></th><th>Scarto totale : '.$sf.'</th><th><a href="CreateForm.php"><img src="home.jpg"></a></tr></tfoot>';
                    $table.='</table>';
                    return $this->html=$table;
                }
            }
      ?>
    Ho creato un altro file chiamato run_class.php che mi esegue correttamente la classe e dovrebbe poi passare i valori a excel.php che mi apre la tabella generata su excel, ma non capisco come mai in excel.php non ci entra proprio.
    Di seguito i codici:

    run_class.php
    codice:
    <html>
        <body background="macchina.jpg">
            <?php
                    include('risultato.php');
                    
                    $user=$_POST['user'];
                    $filename = $_POST['file'];
                    
                    $res=new Goptimeze();
                    $res->parseRequest(); 
                    
            ?>
        <form action="excel.php" method="post">
            <input type="hidden" name="user" value="<?php echo $user; ?>"    />
            <input type="hidden" name="file" value="<?php echo $filename; ?>" />
            <input type="button" value="Crea XLS">
        </form>
            <div style="position: absolute; top:10px; right: 10px">
                <img src="x.png">
            </div>
            <div style="position: absolute; position:fixed; bottom:5px; right: 10px">            
                <a target="_blank" href="https://www"><font color="blue" size="3">x</font></a> 
               <a target="_blank" href="https://www"><font color="blue" size="3">x</font></a>
            </div>
            <br><br>
        </body>
    </html>
    excel.php
    codice:
        <?php
            $filename = $_POST['file'];
            $user=$_POST['user'];
            
            require_once('risultato.php');
            include('run_class.php');
            
            header("Content-Type: application/vnd.ms-excel");
            header("Content-Disposition: inline; filename=".$user."-".$filename);
            
            $res->parseRequest(); 
    
        ?>

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2019
    Messaggi
    31
    Ok ora ho corretto l'errore, mi apre correttamente il file excel con il nome formato da user-filename.xls
    Solo che mi apre la tabella senza righe, come si vede nell'immagine in allegato risultato.jpg

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2019
    residenza
    Sicilia
    Messaggi
    79
    C'è scritto nel file excel generato qual è il problema...

    Codice PHP:
    undefined index $data 
    La variabile $data non viene inizializzata, quindi il seguente foreach da errore perché tenta di ciclare una variabile vuota.

    Accertati che $data contenga un array.

    Per fare un pò di debug al volo utilizza var_dump()

Tag per questa discussione

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 © 2019 vBulletin Solutions, Inc. All rights reserved.