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

samurai.sette

Utente Attivo
17 Dic 2015
204
5
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.
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.036
59
48
IT/SW
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');
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
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.
 

macus_adi

Utente Attivo
5 Dic 2017
1.036
59
48
IT/SW
Se hai copiato e incollato il mio codice certo, per creare il "modello" ho gestito il tutto con due funzione FAKER, infatti:
$simulazione_dati=make_fake_data();
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!