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

samurai.sette

Utente Attivo
17 Dic 2015
235
6
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
235
6
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.343
91
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
235
6
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.343
91
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!
 
Discussioni simili
Autore Titolo Forum Risposte Data
myprobsql [PHP] Esportare con PHP dati da MySQL a CSV PHP 2
M [PHP] Esportare in word PHP 2
M [PHP] Esportare dati csv in cartella predefinita PHP 0
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0

Discussioni simili