Layout di foglio Excel generato con PhpSpreadsheet

DiegoPTn

Nuovo Utente
9 Apr 2020
12
0
1
Trento
Ciao a tutti.
Ho un foglio Excel generato da PhpSpreadsheet leggendo i dati da un array. Il layout è il seguente :

N.Camera - Data - Occupazione
1 – 13/01/20 – 4
2 – 13/01/20 – 7
3 – 13/01/20 – 3
1 – 14/01/20 – 5
2 – 14/01/20 – 8
3 – 14/01/20 – 6

Io avrei bisogno però che i dati fossero impaginati in questo modo :
Data – camera 1 – camera 2 – camera 3
13/01/20 – 4 – 7 – 3
14/01/20 – 5 – 8 – 6

Considerando che lo script php che uso è quello che riporto di seguito, mi sapete dire come si fa a impaginare i dati ?

$csv = '"data","id camera", "disponibilita"' . "\n";
foreach($d_json['availabilities'] as $item)
{
$csv .= ''.$item['date'].', '.$item['room_type_id'].','.$item['real_availability'][0]. '' . "\n";
}

// (a) converto la stringa $CSV in un ARRAY
$stringa = $csv;
$a = explode(',', $stringa);

$spreadsheet->getActiveSheet()
->fromArray($a,NULL);

// (b) salvo il risultato nel file xlsx
$writer = new Xlsx($spreadsheet);
$writer->save('Prova.xlsx');


Grazie e buona giornata.
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Immaginando il tuo file d'ingresso (lo si può solo intuire da come hai scritto) vedi se una cosa del genere va bene

PHP:
class RoomService {

   public $input=[];

   public $intest=[];

   public $output=[];

   public function __construct($opts=[]) {
      array_walk($opts,function($v,$k){
         (property_exists($this,$k))?$this->$k=$v:null;
      });
   }


   public static function getInstance($opts=[]){
      return (new self($opts));
   }

   public function createSpreadSheets(){
      $map=['createIntest','splitData',];
      array_map(function($elem){
         call_user_func([$this,$elem]);
      },$map);
      return $this;
   }

   private function createIntest(){
      $this->intest=['date'];
      foreach ($this->input as $elem){
         (!in_array('camera_'.$elem['room_type_id'],$this->intest))?$this->intest[]='camera_'.$elem['room_type_id']:null;
      }
   }
   private function splitData(){
      $local=[];
      foreach ($this->input as $elem){
         (!isset($local[strtotime($elem['date'])]))?$local[strtotime($elem['date'])]=[]:null;
         foreach ($this->intest as $intest){
            (!isset($local[strtotime($elem['date'])][$intest]))?$local[strtotime($elem['date'])][$intest]=0:null;
         }
         (isset($local[strtotime($elem['date'])]['camera_'.$elem['room_type_id']]))?$local[strtotime($elem['date'])]['camera_'.$elem['room_type_id']]+=$elem['real_availability'][0]:$local[strtotime($elem['date'])]['camera_'.$elem['room_type_id']]=$elem['real_availability'][0];
         $local[strtotime($elem['date'])]['date']=$elem['date'];
         ksort($local[strtotime($elem['date'])]);
      }
      ksort($local);
      $this->output=array_values($local);
   }
}
Dati da passare
PHP:
$data[]=[
   'date'=>'2020-01-'.rand(13,17),
   'room_type_id'=>rand(1,4),
   'real_availability'=>[rand(4,8)]
];
Per invocare la classe basta questa linea di codice (naturalmente la variabile data deve essere nel formato di cui sopra)
PHP:
$result=RoomService::getInstance(['input'=>$data])->createSpreadSheets()->output;
print_r($result);
Good Luck
 

DiegoPTn

Nuovo Utente
9 Apr 2020
12
0
1
Trento
Scusa se ne approfitto, ma visto che ho trovato uno che ne sa, volevo chiederti un'altra cosa sempre relativa al layout.
Non capisco perchè sul foglio excel generato ("Prova.xlsx") tutto l'array esce sulla riga 1 (separato correttamente cella per cella) anzichè uscire in riga/colonna, in questo modo:

data id camera disponibilita
2020-04-03 3 4
2020-04-03 24 8
2020-04-03 25 2
2020-04-03 2 5
2020-04-03 26 6
2020-04-03 1 3
2020-04-03 4 3
2020-04-03 27 2
2020-04-03 28 5
2020-04-03 23 1
2020-04-03 5 15

Il codice che utilizzo è il seguente (salto le parti di connessione al web service per non dilungarmi troppo):
PHP:
<?php

...

//echo"<h2>CONVERTO JSON IN ARRAY PHP:</h2>";

$d_json = json_decode($response, true);


$csv = 'data,id camera,disponibilita,' . "\n";

foreach($d_json['availabilities'] as $item)

{

     $csv .= ''.$item['from'].',' . $item['room_type_id'].','.$item['real_availability'][0].','.'' . "\n";

}


// carico la librerie PHPSPREADSHEET

require 'lib/vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;

use PhpOffice\PhpSpreadsheet\Writer\Xlsx;


// carico il file Prova.xlsx

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();

$reader->setReadDataOnly(true);

$spreadsheet = $reader->load("Prova.xlsx");


// SCRIVO IL CONTENUTO DELL'ARRAY NEL FILE XLSX:

// MI POSIZIONO SUL FOGLIO ACTUAL

$spreadsheet->setActiveSheetIndexByName('actual');

// (a) converto la stringa $CSV in un ARRAY

  $arrayData = $csv;

  $a = explode(',', $arrayData);


$spreadsheet->getActiveSheet()

    ->fromArray($a,NULL);


// (b) salvo il risultato nel file xlsx

$writer = new Xlsx($spreadsheet);

$writer->save('Prova.xlsx');

?>
Puoi dirmi dove sbaglio ? Grazie ancora
 
Ultima modifica di un moderatore:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.298
332
83
@DiegoPTn

Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
PHP (2).png
quando posti del codice php, oppure la funzione codice dalla barra degli strumenti
box inserisci.png

Inoltre IMPORTANTE: Prima di creare una nuova discussione o di rispondere alle discussioni esistenti ricordati di leggere attentamente il Regolamento del Forum e l'eventuale regolamento specifico della sezione!
Grazie


Per questa volta te lo sistemo io ma mi raccomando per il futuro altrimenti sarò costretto a cancellare le discussioni