• Home
  • Forum
  • Fare Web
  • PHP

Layout di foglio Excel generato con PhpSpreadsheet

  • Creatore Discussione Creatore Discussione DiegoPTn
  • Data di inizio Data di inizio 16 Apr 2020
  • Tag Tag
    array php phpspreadsheet
D

DiegoPTn

Nuovo Utente
9 Apr 2020
12
0
1
Trento
  • 16 Apr 2020
  • #1
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.343
91
48
IT/SW
  • 16 Apr 2020
  • #2
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
 
D

DiegoPTn

Nuovo Utente
9 Apr 2020
12
0
1
Trento
  • 17 Apr 2020
  • #3
Grazie mille, provo e ti so dire.
 
D

DiegoPTn

Nuovo Utente
9 Apr 2020
12
0
1
Trento
  • 17 Apr 2020
  • #4
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: 17 Apr 2020

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.445
338
83
  • 17 Apr 2020
  • #5
@DiegoPTn

Da regolamento del forum, come tutti noi sei tenuto ad usare il tag quando posti del codice php, oppure la funzione codice dalla barra degli strumenti

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
 
D

DiegoPTn

Nuovo Utente
9 Apr 2020
12
0
1
Trento
  • 17 Apr 2020
  • #6
chiedo scusa
 
Devi accedere o registrarti per poter rispondere.

Discussioni simili

Bug estetici del nuovo layout
  • felino
  • 18 Dic 2019
  • Supporto Mr.Webmaster
Risposte
1
Visite
2K
Supporto Mr.Webmaster 18 Dic 2019
maxbossi
A
[WordPress] Elementor responsive layout
  • AlecsSandro
  • 2 Apr 2019
  • WordPress
Risposte
8
Visite
6K
WordPress 1 Apr 2021
glm1986ITALY
[HTML] Realizzazione di un layout dinamico di immagini
  • Andrea_Ventura
  • 22 Giu 2018
  • HTML e CSS
Risposte
4
Visite
1K
HTML e CSS 22 Giu 2018
Andrea_Ventura
[HTML] Layout multicolonna (no table)
  • Andrea_Ventura
  • 16 Giu 2018
  • HTML e CSS
Risposte
2
Visite
2K
HTML e CSS 17 Giu 2018
mr.x
M
L
border in tabella php + layout stampa
  • lelemkop
  • 24 Ott 2017
  • PHP
Risposte
0
Visite
2K
PHP 24 Ott 2017
lelemkop
L
[PHP] layout pagina con immagine codice a barre
  • crealatualista
  • 18 Set 2017
  • PHP
Risposte
3
Visite
3K
PHP 19 Set 2017
marino51
css esterno con layout
  • utente
  • 27 Lug 2017
  • HTML e CSS
Risposte
1
Visite
1K
HTML e CSS 2 Ago 2017
Max 1
N
problema con CollapsingToolbarLayout
  • newbie1980
  • 27 Ott 2016
  • Sviluppo app per Android
Risposte
0
Visite
1K
Sviluppo app per Android 27 Ott 2016
newbie1980
N
F
layout stampa css
  • Fabio90
  • 11 Mar 2016
  • HTML e CSS
Risposte
2
Visite
2K
HTML e CSS 11 Mar 2016
Fabio90
F
G
Java & layout
  • Giovanni255
  • 13 Feb 2016
  • Java
Risposte
2
Visite
2K
Java 11 Mag 2016
Giovanni255
G
M
Layout e menu mobile
  • marcoverri
  • 26 Ott 2015
  • HTML e CSS
Risposte
2
Visite
1K
HTML e CSS 27 Ott 2015
marcoverri
M
M
Problema con il layout
  • MikiProgrammer
  • 27 Set 2015
  • HTML e CSS
Risposte
3
Visite
1K
HTML e CSS 27 Set 2015
filomeni
R
Dubbi Incolonnamento Layout con Bootstrap.
  • RBNZ
  • 16 Apr 2015
  • HTML e CSS
Risposte
1
Visite
2K
HTML e CSS 17 Apr 2015
Max 1
  • Bloccata
Problemi layout con firefox
  • Marco_88
  • 19 Mar 2015
  • HTML e CSS
Risposte
3
Visite
1K
HTML e CSS 20 Mar 2015
Marco_88
Adattare un layout desktop ad un responsive
  • felino
  • 8 Mar 2015
  • HTML e CSS
Risposte
9
Visite
2K
HTML e CSS 17 Mar 2015
Max 1
K
Aggiornare solo una parte di Layout
  • kalimett
  • 15 Ott 2014
  • Sviluppo app per Android
Risposte
0
Visite
1K
Sviluppo app per Android 15 Ott 2014
kalimett
K
A
Consiglio su layout responsive
  • alessiof86
  • 14 Ott 2014
  • HTML e CSS
Risposte
3
Visite
2K
HTML e CSS 15 Ott 2014
Soulfearor
S
E
layout responsive problemi con google chrome su smartphone android e win 8
  • Emanuele.Basilicata
  • 4 Set 2014
  • HTML e CSS
Risposte
0
Visite
2K
HTML e CSS 4 Set 2014
Emanuele.Basilicata
E
D
Tabella con layout per smartphone
  • danielloantonio
  • 4 Set 2014
  • HTML e CSS
Risposte
2
Visite
2K
HTML e CSS 4 Set 2014
danielloantonio
D
G
Javascript library layout
  • gquarta
  • 26 Lug 2014
  • Javascript
Risposte
1
Visite
1K
Javascript 2 Ago 2014
criric
Condividi:
Facebook X (Twitter) LinkedIn WhatsApp e-mail Condividi Link
  • Home
  • Forum
  • Fare Web
  • PHP
  • Italiano
  • Termini e condizioni d'uso del sito
  • Policy Privacy
  • Aiuto
  • Home
Community platform by XenForo® © 2010-2024 XenForo Ltd. | Traduzione a cura di XenForo Italia
Menu
Accedi

Registrati

  • Home
  • Forum
    • Nuovi Messaggi
    • Cerca...
  • Novità
    • Featured content
    • Nuovi Messaggi
    • Ultime Attività
X

Privacy & Transparency

We use cookies and similar technologies for the following purposes:

  • Personalized ads and content
  • Content measurement and audience insights

Do you accept cookies and these technologies?

X

Privacy & Transparency

We use cookies and similar technologies for the following purposes:

  • Personalized ads and content
  • Content measurement and audience insights

Do you accept cookies and these technologies?