* $dati=array(array('colonna1','colonna2','colonna3'), * array('primo',1,'1/2/2005'), * array('secondo',2,'2005-2-1'), * array('terzo',3,'1-2/2006'), * array('quarto',4,'11/2/2006'), * array('quinto',5,'1/12/2006'), * array('sesto',6,'12/2/2006'), * array('settimo',7,'12/2/2006') * ); * $xls=new MyExcel('Nome Foglio',$dati); * * $xls->set_style('text-decoration: underline; font-weight: bold','A',1,$xls->get_n_cols()); //RENDE MAIUSCOLA E SOTTOLINEA LA PRIMA RIGA * * * $xls->Set_Formula('SUM(B2:A'.$xls->get_n_rows().')', * 'B', * $xls->get_n_rows()+1); //inserisco la SOMMA dei valori della colonna A dopo l'ultima riga della colonna "A" * $xls->set_valore('Totale','A',$xls->get_n_rows()); //inserisco la scritta "Totale" IN GRASSETTO a quella che adesso è l'ultima riga della colonna "A" * $xls->set_protezione('A',$xls->get_n_rows(),$xls->get_n_COLS()); //PROTEGGE L'ULTIMA RIGA * * $xls->unisci_celle('A',3,1,2); * * $xls->allinea_orizzontale('center'); //ALLINEA AL CENTRO IL CONTENUTO DI TUTTA LA TABELLA * $xls->allinea_verticale('top','A',1,1,$xls->get_n_rows()); //ALLINEA IN ALTO IL CONTENUTO DELLA PRIMA COLONNA * * $xls->set_colori('red','blue','B',2,$xls->get_n_cols()-1,$xls->get_n_rows()-2); * * $xls->BloccaRiquadri(2); * * * $xls->send('file.xls'); //restituisco il file xls con il nome file.xls * * */ class myExcel extends myMatrix { protected /** @ignore */ $attributi,$info_cell, $proteggi='False'; /** Costruttore di classe * * @access public * @param string $nome è Nome della classe * @param array $valori array di array con i valori */ function MyExcel($nome,$valori=array()) { parent::myMatrix($valori); $this->attributi['nome']=(strlen(trim($nome))==0?'Foglio1':$nome); $this->attributi['query']=array(); } /** @access private */ function stili(&$attuale,$attributi) { $align=$this->estrai_attributo($attributi,'align'); if ($align) $attuale['style']['text-align']=$align; $valign=$this->estrai_attributo($attributi,'valign'); if ($valign) $attuale['style']['vertical-align']=$align; $style=$this->estrai_attributo($attributi,'style'); if($style) {$css=new MyCss(); $attuale['style']=array_merge((array) $attuale['style'],(array) $css->parseStyle($style)); } $class=$this->estrai_attributo($attributi,'class'); if ($class) $attuale['class']=$class; return $attributi; } /** * Es. * * $tabella=new myTableQRY($conn,"select stipendio,matricola,cognome from utente" * true, * 'border=1 cellspacing=0 cellpadding=1'); //creo mytable * $xls=new MyExcel('fog'); //creo xls vuoto * $xls->Importa_MyTable($tabella,array(1,0)); //importo solo la terza e la prima colonna in quest'ordine * $xls->send('file.xls'); * * * @param MyTable $MyTable è la tabella a partire della quale costr. l'excel * @param array $colonne E' opzionale e se inserito indica i numeri delle colonne da visualizzare (viene rispettato l'ordine) * @param array $righe E' opzionale e se inserito indica i numeri delle righe da visualizzare (viene rispettato l'ordine) * @param boolean $intestazione Indica se deve essere inportata anche l'eventuale intestazione * @param boolean $formattato Indica se deve essere rispettato le formattazuione della tabella impostata nella mytable */ function Importa_MyTable($MyTable,$colonne='',$righe='',$intestazione=true,$formattato=true) { $valori=array(); if ($formattato) $this->attributi['TABLE']=$MyTable->ricalcola_TAG(0,0,'TABLE'); if (!$righe) for ($y=0;$y<$MyTable->get_N_rows();$y++) $righe[]=$y; if (!$colonne) for ($x=0;$x<$MyTable->get_N_cols();$x++) $colonne[]=$x; $i=0; if ($righe) foreach ($righe as &$y) { $j=0; foreach ($colonne as &$x) { if ($formattato) { $this->info_cella[$i][$j]['TD']['ereditati']=$this->stili($this->info_cella[$i][$j]['TD'], $MyTable->ricalcola_TAG($y,0,'TR')); $this->info_cella[$i][$j]['TD']['ereditati'].=" ". $this->stili($this->info_cella[$i][$j]['TD'], $MyTable->ricalcola_TAG($y,$x,'TD')); } $valore=$MyTable->ricalcola_cella($y,$x); $d=new myDate('',strip_tags($valore)); if (!$d->Errore() && strlen(trim($valore))) { $valore=$d->get_value_DB(); } $valori[$i][$j]=$valore; $j++; } $i++; } if ($intestazione && $MyTable->get_intestazioni()) {$intesta=$MyTable->get_intestazioni(); foreach (array_keys($intesta) as $x) { if ($formattato) { $info_cella[$x]['TD']['ereditati']= $this->stili($info_cella[$x]['TD'],$MyTable->ricalcola_TAG_intestazione($x,'TR')); $info_cella[$x]['TD']['ereditati'].=' '.$this->stili($info_cella[$x]['TD'],$MyTable->ricalcola_TAG_intestazione($x,'TD')); } $intesta_new[$x]=$intesta[$x]; } array_unshift($valori,$intesta_new); if ($formattato) array_unshift($this->info_cella,$info_cella); } $this->valori=&$valori; return $this; } /** * Viene chiamata per ogni cella quando si costruisce l'html della tabella, estendendo questa classe e * riscrivendo questo metodo è possibile inserire regole di visualizzazione personalizzate in base a riga,colonna * es. se si vuole che il dato della colonna 6 sia un link che usa il valore della colonna 7 * Class prova extends myTable { * function ricalcola_cella($riga,$colonna) { * if ($colonna!=6) return parent::ricalcola_cella($riga,$colonna); * else return '<a href="link.php?parametro='.$this->get_cell($riga,7).'">'.$this->get_cell($riga,6).'</a>'; * } * } * @param int $riga * @param int $colonna * @return string Il valore che deve comparire nella cella della tabella */ function ricalcola_cella($riga,$colonna) { return $this->get_cell($riga,$colonna); } /** @access private */ function maxr($x) { if (!$x) return; return max(@array_keys($x)); } /** @access private */ function maxc($x) { $max=-10000; if ($x) foreach ($x as $xx) $max=max($max,max(@array_keys((array) $xx))); return $max; } /** @access private */ function calcolacoord($x) { if (is_int($x)) $x--; else $x=ord(strtoupper($x))-ord('A'); return $x; } /** @access private */ function estrai_attributo(&$x,$attr,$coppia=false) { $attr=strtolower($attr); while ($x!=($X=str_replace(' =','=',$x))) $x=$X; while ($x!=($X=str_replace('= ','=',$x))) $x=$X; $p1=$p=strpos(strtolower($x),$attr); if ($p===false) return null; $p+=strlen($attr); $extra=1; $x.=' '; if ($x[$p]=="'") {$p++;$f=strpos(strtolower($x),"'",$p+2);$sep="'";} elseif($x[$p]=='"') {$p++; $f=strpos(strtolower($x),'"',$p+2);$sep='"';} else $f=strpos(strtolower($x)," ",$p+2); if ($p>=$f) return null; $out=substr($x,$p,$f-$p); $x=str_replace(substr($x,$p1,$f-$p1+1),'',$x); if (!$coppia) return $out; else return array('val'=>$out,'sep'=>$sep); } /** @access private */ /*function estrai_attributo(&$x,$attr) { $attr=trim(strtolower($attr)); while ($x!=($X=str_replace(' =','=',$x))) $x=$X; while ($x!=($X=str_replace('= ','=',$x))) $x=$X; $p1=$p=strpos(strtolower($x),$attr); if ($p===false) return null; $p=1+strpos(strtolower($x),'=',$p+1); $extra=1; $x.=' '; if ($x[$p]=="'") {$p++;$f=strpos(strtolower($x),"'",$p+2);} elseif($x[$p]=='"') {$p++; $f=strpos(strtolower($x),'"',$p+2);} else $f=strpos(strtolower($x)," ",$p+2); if ($p>=$f) return null; $out=substr($x,$p,$f-$p); $x=str_replace(substr($x,$p1,$f-$p1+1),'',$x); return $out; } */ /** @access private */ function implodi($x) { if (is_array($x)) foreach ($x as $k=>$v) { if (is_array($v)) {$u=''; foreach ($v as $kk=>$vv) if ($k=='style') $u.="$kk:$vv;"; else $u.="$kk$vv"; $out.=" $k=\"$u\""; } else $out.=" ".trim($v); } return $out; } /** @access private */ function assolutizza($html) { $dir=explode('/',$_SERVER['PHP_SELF']); unset($dir[count($dir)-1]); $dir=implode('/',$dir); $relativo=$_SERVER['HTTP_HOST']."$dir/"; $assoluto=$_SERVER['HTTP_HOST']; $pre[]=" action="; $pre[]=" src="; $pre[]=" background="; $pre[]=" href="; $pre[]="url\("; $pre[]=" codebase="; $pre[]=" url="; $pre[]=" archive="; $pre[]=" action="; $html=explode('<',$html); foreach ($html as $i=>$tag) if (strpos($tag,'>')!==false) { $tag=explode(' ',$tag,2); $corretti=''; foreach ($pre as $attr) if (stripos($html[$i],$attr)!==false) {$old=$tag[1]; $tag[1]=' '.$tag[1]; $v=MyExcel::estrai_attributo($tag[1],$attr,true); $V=$v['val']; $S=$v['sep']; if(parse_url($V)==null) $tag[1]=$old; else { if ($V{0}=='/') $V="http://".str_replace('//','/',htmlentities("$assoluto$V")); elseif(stripos($V,'http://')!==0) $V="http://".str_replace('//','/',htmlentities("$relativo$V")); $corretti.="$attr$S$V$S "; } } if (stripos($tag[0],'param')!==false && strpos($tag[1],'name="movie"')!==false) {$old=$tag[1]; $tag[1]=' '.$tag[1]; $attr=" value="; $v=MyExcel::estrai_attributo($tag[1],$attr,true); $V=$v['val']; $S=$v['sep']; if(parse_url($V)==null) $tag[1]=$old; else { if ($V{0}=='/') $V="http://".str_replace('//','/',htmlentities("$assoluto$V")); elseif(stripos($V,'http://')!==0) $V="http://".str_replace('//','/',htmlentities("$relativo$V")); $corretti.="$attr$S$V$S "; } } $tag[1]=$corretti.$tag[1]; $html[$i]=implode(' ',$tag); } $html=implode('<',$html); return $html; } /*function ____assolutizza($html) { $delim[]='"'; $delim[]="'"; $delim[]=""; $pre[]="src="; $pre[]="background="; $pre[]="href="; $pre[]="url\("; $pre[]="codebase="; $pre[]="url="; $pre[]="archive="; $pre[]="action="; foreach ($pre as $pref) foreach ($delim as $del) { //$html=preg_replace("/($pref$del)"."([a-zA-Z0-9\_]{})/i",$pref.$del.'http://'.$_SERVER['HTTP_HOST']."$dir/\$3",$html); //$html=preg_replace("/($pref$del\/)/i",$pref.$del.'http://'.$_SERVER['HTTP_HOST'].'/',$html); //$html=preg_replace("/($pref$del\.)/i",$pref.$del.',$html); $html=preg_replace("/($pref$del)([a-zA-Z0-9\_\/\:\.\&\?\#]+)/e","(ereg('^http:','\\2') || ereg('^#','\\2') ? stripslashes('\\1\\2') :(ereg('^\/','\\2')?stripslashes('\\1$assoluto\\2'):stripslashes('\\1$relativo\\2')))",$html); } return $html; } */ function get_tipo($x) { if (strlen($x)>0) { if (preg_match('/^([\+\-]{0,1}[0-9]*\.{0,1}[0-9]?)$/',$x) || //float preg_match('/^(([0-9]{1,2})([\.|\-|\:]{1,1})([0-9]{1,2}))(\.|\-|\:([0-9]{1,2}){0,1})?$/',$x) || //time preg_match('/^(([0-9]{1,4})[/.-]([0-9]{1,2})[/.-]([0-9]{1,4}))$/',$x) //data aa-mm-gg gg-mm-aa ) return " x:num "; } } function get_html($colonne=array(),$righe=array()) { // echo "
";     print_r($this->info_cella[0][0]);      exit;
      $out= 'attributi['TABLE'].' '.$this->implodi($this->info_cella[0][0]['TABLE']).'>';
      $i=0;
      $rig=$this->get_n_rows();
      $col=$this->get_n_cols();
	  if (!$righe)	for ($y=0;$y<$rig;$y++)	 $righe[]=$y;
	  if (!$colonne) for ($x=0;$x<$col;$x++) $colonne[]=$x;

      foreach ($righe as &$i)
      	{
	      $rigahtml='';
	 	  foreach ($colonne as &$j)
	 	 				if (!$this->info_cella[$i][$j]['nascosta'])
	 	 						{
	 	   					     $rigahtml.='';
	 	   						}
	 	 // echo "$i $j ".$this->implodi($this->info_cella[$i][$j]['TR'])."
"; $out.="implodi($this->info_cella[$i][$j]['TR']).">$rigahtml\n"; } return $out."
implodi($this->info_cella[$i][$j]['TD']).'>'.$this->ricalcola_cella($i,$j).'
"; } /** IMPOSTAZIONI DI STAMPA * @param orizzontale|verticale $verso del foglio * @param int $dx margine in cm * @param int $su margine in cm * @param int $sx margine in cm * @param int $giu margine in cm * @param int $intestazione intestazione in cm * @param int $piepagina piepagina in cm * @param int $larghezza in cm * @param int $altezza in cm */ function imposta_pagina($verso="",$dx="",$su="",$sx="",$giu="",$intestazione="",$piepagina="",$larghezza=21,$altezza=29.7) { if ($verso=='orizzontale' || $verso=='landscape') $verso='landscape'; else $verso=''; $this->attributi[$this->attuale]['size']="size:{$larghezza}cm {$altezza}cm "; $this->attributi[$this->attuale]['margini']=" ". ($x1!==''?"margin: ".$dx."cm ".$su."cm ".$sx."cm ".$giu."cm;\n":""). ($intestazione?"mso-header-margin:".$intestazione."cm;\n":""). ($piede?"mso-footer-margin:".$piepagina."cm;\n":""). ($verso?"mso-page-orientation:$verso;\n":""). "mso-horizontal-page-align:center;\n"; return $this; } /** *Setta intestazione e pie pagina, i dati vanno inseriti secondo la codifica Excel * Es. volendo mettere come intestazione il nome del foglio e come piè pagina la scritta Pagina x di y * * $xls->set_intestazione("&H","Pagina &P di &M"); * * * @param string $intestazione * @param string $piepagina */ function set_intestazione($intestazione="",$piepagina="") { $this->attributi['intestazione']=''; if ($intestazione) $this->attributi['intestazione']="mso-header-data:\"$intestazione\";"; if ($piepagina) $this->attributi['intestazione'].="mso-footer-data:\"$piepagina\";"; return $this; } /** Blocca i riquadri sulla riga $y * * $xls->BloccaRiquadri(2); //blocca la prima riga * * @param int $y */ function BloccaRiquadri($y){ $y=$this->calcolacoord($y); $this->attributi['blocca']=" 1 $y 2"; return $this; } function get_n_rows() { return 1+max($this->maxr($this->valori),$this->maxr($this->info_cella)); } function get_n_cols() { return 1+max($this->maxc($this->valori),$this->maxc($this->info_cella)); } /** Unisci celle * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param int $ncolonne * @param int $nrighe */ function unisci_celle($x,$y,$ncolonne='',$nrighe='') { if ($ncolonne<1) $ncolonne=1; if ($nrighe<1) $nrighe=1; $x=$this->calcolacoord($x); $y=$this->calcolacoord($y); $rig=$this->get_n_rows()-1; $col=$this->get_n_cols()-1; if ($nrighe>1) {$this->info_cella[$y][$x]['TD']['rowspan']="rowspan='$nrighe'";} if ($ncolonne>1) {$this->info_cella[$y][$x]['TD']['colspan']="colspan='$ncolonne'";} for ($i=0;$i<$nrighe;$i++) for ($j=0;$j<$ncolonne;$j++) if ($j!=0 || $i!=0) $this->info_cella[$i+$y][$j+$x]['nascosta']=1; return $this; } /** Inserisce interruzione di pagina * @param int $y RIGA A PARTIRE DA 1 */ function add_interruzione_pagina($y) { $y=$this->calcolacoord($y); //$this->info_cella[$y][2]['TR']['style']['page-break-before']='always'; $this->attributi['interruzioni'].= " $y "; return $this; } /** Imposta caratteristiche grafiche delle celle con foglio di style * es, per impostare il testo delle celle A1 e A2 in grassetto e sottolineato * * $xls->set_style('text-decoration: underline; font-weight: bold','A',1,2); * * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param string $parametri * @param int $ncolonne * @param int $nrighe * @param boolean $verifica se vero effettua verifica sui nomi dei parametri passati */ function set_style($parametri,$x='',$y='',$ncolonne='',$nrighe='',$verifica=true) { if ($ncolonne<1) $ncolonne=1; if ($nrighe<1) $nrighe=1; $css=new MyCss(); $par=$css->parseStyle($parametri,$verifica); if (!$par) return; if (!$x && !$y) {$this->info_cella[0][0]['TABLE']['style']=array_merge((array) $this->info_cella[0][0]['TABLE']['style'],(array) $par); return; } $x=$this->calcolacoord($x); $y=$this->calcolacoord($y); for ($i=0;$i<$nrighe;$i++) for ($j=0;$j<$ncolonne;$j++) { $this->info_cella[$i+$y][$j+$x]['TD']['style']=array_merge((array) $this->info_cella[$i+$y][$j+$x]['TD']['style'],(array) $par); } return $this; } /** Allineamento verticale del contenuto delle celle * @param top|bottom|middle $allineamento * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param int $ncolonne * @param int $nrighe */ function allinea_verticale($allineamento,$x='',$y='',$ncolonne='',$nrighe='') { $this->set_style("vertical-align:$allineamento",$x,$y,$ncolonne,$nrighe); return $this; } /** Allineamento orizzontale del contenuto delle celle * @param center|left|right $allineamento * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param int $ncolonne * @param int $nrighe */ function allinea_orizzontale($allineamento,$x='',$y='',$ncolonne='',$nrighe='') { $this->set_style("text-align:$allineamento",$x,$y,$ncolonne,$nrighe); return $this; } /** Imposta font delle celle * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param string $font nome del font * @param float $dim dimensione in pt * @param int $nrighe * @param int $ncolonne */ function set_font($font,$dim='',$x='',$y='',$ncolonne='',$nrighe='') { $this->set_style("font-style:$font",$x,$y,$ncolonne,$nrighe); if ($dim) $this->set_style("font-size:$dim pt",$x,$y,$ncolonne,$nrighe); return $this; } /** Imposta colori delle celle * @param string $ctesto colore del testo es 'red' o '#ff0000' * @param string $csfondo colore dello sfondo * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param int $ncolonne * @param int $nrighe */ function set_colori($ctesto='',$csfondo='',$x='',$y='',$ncolonne='',$nrighe='') { if ($ctesto) $this->set_style("color:$ctesto",$x,$y,$ncolonne,$nrighe); if ($csfondo) $this->set_style("background:$csfondo",$x,$y,$ncolonne,$nrighe); return $this; } /** Protegge celle scelte, * SERVE SOLO AD IMPEDIRE L'INSERIMENTO ERRATO IN ZONE RISERVATE * L'UTENTE PUO' AGEVOLMENTE RIMUOVERE QUESTA PROTEZIONE * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param int $ncolonne * @param int $nrighe */ function set_protezione($x='',$y='',$ncolonne='',$nrighe='') { $this->set_style("mso-protection:locked visible",$x,$y,$ncolonne,$nrighe); $this->proteggi='True'; return $this; } /** setta classe css * @param string $class * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 * @param int $ncolonne * @param int $nrighe */ function set_class($class,$x='',$y='',$ncolonne='',$nrighe='') { if ($ncolonne<1) $ncolonne=1; if ($nrighe<1) $nrighe=1; if (!$x && !$y) {$this->info_cella[0][0]['TABLE']['class']=array_merge((array) $this->info_cella[0][0]['TABLE']['style'],(array) $par); return; } $x=$this->calcolacoord($x); $y=$this->calcolacoord($y); for ($i=0;$i<$nrighe;$i++) for ($j=0;$j<$ncolonne;$j++) $this->info_cella[$i+$y][$j+$x]['TD']['class']=$class; return $this; } /** Inserisce formula * @param mixed $valore * @param char|int $x E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y RIGA A PARTIRE DA 1 */ function set_valore($valore,$x,$y) { $this->valori[$this->calcolacoord($y)][$this->calcolacoord($x)]=$valore; return $this; } /** Inserisce formula * Es. * $tabella=$conn->myTableQRY("select stipendio,matricola,cognome from utente" * false, * 'border=1 cellspacing=0 cellpadding=1'); //creo mytable con * $xls=new MyExcel('fog'); //creo xls vuoto * $xls->Importa_MyTable($tabella,array(1,0)); //importo solo la terza e la prima colonna in quest'ordine * * $xls->Set_Formula('SUM(B2:A'.$xls->get_n_rows().')', * 'B', * $xls->get_n_rows()+1); //inserisco la SOMMA dei valori della colonna A dopo l'ultima riga della colonna "A" * * $xls->set_valore('Totale','A',$xls->get_n_rows()); //inserisco la scritta "Totale" a quella che adesso è l'ultima riga della colonna "A" * $xls->send('file.xls'); * * * @param char|int $x //E' LA LETTERA O NUMERO DELLA COLONNA (a partire da 1) * @param int $y //RIGA A PARTIRE DA 1 * @param string $formula */ function Set_Formula($formula,$x,$y){ $this->info_cella[$this->calcolacoord($y)][$this->calcolacoord($x)]['TD']['formule']="x:fmla=\"=$formula\""; //echo "
";print_r($this->info_cella);
		return $this;
	}


	/** Definisce un intervallo in cui dovranno essere caricati file esterni,
	 *  x1,y1,x2,y2 definiscono l'area dalla quale si potrà chiamare l'"aggiorna dati"
	 *  x1,y1 è l'angolo in alto a destra nella quale si posiziona la tabella importata
	 * @param   string $nome
	 * @param   string $url (MAX 255 caratteri)
	 * @param 	boolean $AncheFormattazione se true (default è false) carica anche la formattazione dell'HTML
	 * @param   char $x1  E' LA LETTERA dell'angolo in alto a destra
	 * @param   int  $y1  RIGA A PARTIRE DA 1  dell'angolo in alto a destra
 	 * @param   char $x1  E' LA LETTERA della colonna  dell'angolo in basso a sinistra
	 * @param   int  $y1  RIGA A PARTIRE DA 1 dell'angolo in basso a sinistra
	 *
    */
	function Set_Query($nome,$url,$AncheFormattazione=false,$x1,$y1,$x2,$y2,$NTabella=''){
	// $url=htmlentities($url);

	 if (strlen($NTabella))  	$idTabella=" 
       											$NTabella
       										";
	 						else $idTabella=" ";

	 if ($AncheFormattazione) $AncheFormattazione="All";
	 $this->attributi['query'][$nome]="
	
	 
     $nome
     
     
     
      Web
      
      
      
      
      $AncheFormattazione
      
       $idTabella
	  2
      2
     
    ";
	$this->attributi['esterni'][$nome]="
  
  $nome
  1
  ='".$this->attributi['nome']."'!\$$x1\$$y1:\$$x2\$$y2
 ";
	return $this;
	}


    /** @access private */
	function get_xml() {
		return "
  	  
  		 	".$this->attributi['nome']."
 	  
    	 
      		
      		9
      		-3
      		0
     	

	     
    	".$this->attributi['blocca']."

     	
      		
       			3
      		
      		
       			2
       	    	0
       		    0
      		
     	
    	".$this->proteggi."
     	True
     	False
      
      
		".$this->attributi['interruzioni']."
      
    ".@implode("\n",$this->attributi['query'])."
    ";
	}



	/** @access private */
	function creaExcel($css=array(),$html='') {
		if ($css) foreach ($css as $nomecss) $CSS.=file_get_contents($nomecss);
		return "
		
		
		
		
		
		
		
		
		
		
		".
		 MyExcel::assolutizza($html?$html:$this->get_html()).
		"
		";

	}

	/** Invia al client il file excel (determina la chiusura dello script)
	 * @param   string $nomeFile
	 * @param   array $css elenco dei nomi dei css da importare
	 * @param   string $html è l'html da usare per la creazione del xls in alternativa ai dati memorizzati
	 * @param   boolean $exit se è true viene eseguito un exit al termine della send, altrimenti lo script chiamante prosegue (in questo caso non dare echo o altre visualizzazioni dopo la send)
  */

	function send($nomeFile,$css=array(),$html='',$exit=true) {
		//session_cache_limiter('private');
		$tutto=$this->creaExcel($css,$html);

		header("Pragma:");
		header("Expires: " . gmdate("D, d M Y H:i:s",time()+30) . " GMT");
	    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

    	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    	header("Cache-Control: public");
    	header("Content-Description: File Transfer");


		header("Content-Disposition: attachment; filename=\"".basename($nomeFile)."\"");

		header("Content-Type: application/force-download");//header('Content-type: application/vnd.ms-excel');
		header("Content-Transfer-Encoding: binary");
	    header("Content-Length: ".strlen($tutto));
		echo $tutto;
		if ($exit) exit;
	}


	/** Salva il file su disco
	 * @param   string $nomeFile
	 * @param   array $css elenco dei nomi dei css da importare
	 * @param   string $html è l'html da usare per la creazione del xls in alternativa ai dati memorizzati
     */

	function Save($nomeFile,$css=array(),$html='') {
		$f=fopen($nomeFile,'w');
	    fwrite($f,$this->creaExcel($css,$html));
	    fclose($f);
		exit;
	}
}






/**
 * @package myOffice
 *
 * Questa classe permette di creare dei file in html che Word sia in grado gestire,
 * l'uso migliore è la produzione di documenti destinati alla stampa.
 * Se tali doc dovranno essere archiviati NON inserire immagini nel documento o si
 * correrà il rischio che non saranno sempre visualizzati.
 * 
 * //definisco due pagine con dei segnaposto che scelco essere della forma *parola*
 * $prima_pagina='
* Spett. *cognome* *nome*
*
*
* Le comunico che lei è .... *
'; * * $seconda_pagina='...*esito*'; * * //istanzio l'oggetto inizializzandolo con la prima pagina * $doc=new MyWord($prima_pagina); * * //aggiungo la seconda pagina * $doc->add_pagina($seconda_pagina); * * //dichiaro un array di valori in cui le chiavi corrispondono ai segnaposto * $destinatari=array(); * $destinatari[0]=array('*cognome*'=>'Gimigliano','*nome*'=>'Gianluca','*esito*'=>'Promosso'); * $destinatari[1]=array('*cognome*'=>'Rossi', '*nome*'=>'Guido', '*esito*'=>'Bocciato'); * $destinatari[2]=array('*cognome*'=>'Foti', '*nome*'=>'Carlo', '*esito*'=>'Non dico niente'); * * * //In alternativa va bene anche: * //$destinatari=$conn->execute("select cognome as '*cognome*' , nome as '*nome*' from persone "); * * * $doc->set_stampa_unione($destinatari); * * //scelgo un'intestazione ed un piè pagina che mi mette in basso a destra il numero di pagina * $doc->set_intestazione("Ministero Affari Inutili" , '
Pag.
'); * $doc->set_protezione(); * $doc->send('file.doc'); *
*/ class myWord { protected /** @ignore */ $attributi,$attuale=0, $proteggi='', $id, $stampaunione, $xml; /** Costruttore di classe * @access public * @param string $html è l'html che rappresenta il contenuto */ function MyWord($html='') { if($html) $this->attributi[$this->attuale]['html']=$html; $this->id= md5(uniqid(rand(), true)); } /** @access private */ function get_sezione($pag) { return "@page Section$pag {". (!$this->attributi[$pag]['size']?"size:595.3pt 841.9pt":$this->attributi[$pag]['size']).';' .$this->attributi[$pag]['margini']. $this->attributi[$pag]['header']. $this->attributi[$pag]['footer']." mso-paper-source:0; } div.Section$pag{page:Section$pag;} "; } /** Inserisce una nuova pagina * @param string $html è l'html che rappresenta il contenuto della nuova pagina */ function add_pagina($html) { $this->attributi[$this->attuale]['html'].= "
"; $this->attuale++; $this->attributi[$this->attuale]=$this->attributi[$this->attuale-1]; $this->attributi[$this->attuale]['html']=$html; return $this; } /** IMPOSTAZIONI DI STAMPA * @param orizzontale|verticale $verso del foglio * @param int $dx margine in cm * @param int $su margine in cm * @param int $sx margine in cm * @param int $giu margine in cm * @param int $intestazione intestazione in cm * @param int $piepagina piepagina in cm * @param int $larghezza in cm * @param int $altezza in cm */ function imposta_pagina($verso="",$dx="",$su="",$sx="",$giu="",$intestazione="",$piepagina="",$larghezza=21,$altezza=29.7) { if ($verso=='orizzontale' || $verso=='landscape') $verso='landscape'; else $verso=''; $this->attributi[$this->attuale]['size']="size:{$larghezza}cm {$altezza}cm "; $this->attributi[$this->attuale]['margini']=" ". ($x1!==''?"margin: ".$dx."cm ".$su."cm ".$sx."cm ".$giu."cm;\n":""). ($intestazione?"mso-header-margin:".$intestazione."cm;\n":""). ($piede?"mso-footer-margin:".$piepagina."cm;\n":""). ($verso?"mso-page-orientation:$verso;\n":""). "mso-horizontal-page-align:center;\n"; return $this; } /** IMPOSTAZIONI DI PAGINA * @param string $intestazione html che rappresenta intestazione * @param string $piepagina html che rappresenta piepagina */ /* function set_intestazione($intestazione='',$piepagina="") { $s=new MySessions('myOffice'); $intesta=$s->get('intestazioni'); $id=$this->id; if ($intestazione) {$intesta[$id][$this->attuale]['intestazione']=MyExcel::assolutizza($intestazione); // $this->attributi[$this->attuale]['header']="mso-header:url('http://$_SERVER[HTTP_HOST]/".MyField::get_MyFormsPath()."myOfficeFiles.php?cosa=Intestazioni&id=$id&".ini_get('session.name')."=".session_id()."') h".$this->attuale.";\n"; $this->attributi[$this->attuale]['header']="mso-header:url('file:///c:/$id".session_id().".xml') h".$this->attuale.";\n"; } if ($piepagina) {$intesta[$id][$this->attuale]['piepagina']=MyExcel::assolutizza($piepagina); $this->attributi[$this->attuale]['footer']="mso-footer:url('file:///c:/$id".session_id().".xml') f".$this->attuale.";\n"; } if ($intestazione.$piepagina) $s->set('intestazioni',$intesta); } */ function set_intestazione($intestazione='',$piepagina="") { $id=$this->id; if ($intestazione) {//$intesta[$id][$this->attuale]['intestazione']=MyExcel::assolutizza($intestazione); $this->attributi[$this->attuale]['header']="mso-header:url('MyDoc_file/MyHeader.htm') h".$this->attuale.";\n"; } if ($piepagina) {//$intesta[$id][$this->attuale]['piepagina']=MyExcel::assolutizza($piepagina); $this->attributi[$this->attuale]['footer']="mso-footer:url('MyDoc_file/MyHeader.htm') f".$this->attuale.";\n"; } if ($intestazione.$piepagina) { $this->xml=' '.($intestazione?"
attuale.">

$intestazione

":"") .($piepagina? "
attuale.">

$piepagina

":""). " "; /* $this->xml['filelist.xml']=" "; */ } return $this; } /** Protegge celle scelte, * SERVE SOLO AD IMPEDIRE L'INSERIMENTO ERRATO IN ZONE RISERVATE * L'UTENTE PUO' AGEVOLMENTE RIMUOVERE QUESTA PROTEZIONE */ function set_protezione() { $this->proteggi=" ReadOnly"; return $this; } /** Imposta l'oggetto su cui si deve creare lo stampa_unione. * L'oggetto può essere un recordset ADODB o un array di array. * In entrambi i casi per ogni riga dell'oggetto l'html contenuto * nella classe MyWord verrà replicata e gli eventuali segnaposto * presenti nell'html verranno sostituiti con il valore della chiave corrispondente. * vedere esempio generale della classe per un esempio d'uso */ function set_stampa_unione($oggetto) { $this->stampaunione=$oggetto; return $this; } /** @access private */ function stampa_unione($html,$str='') { $interPag="
"; if (is_array($this->stampaunione)) {$n=count($this->stampaunione); foreach ($this->stampaunione as $chiavi) { if(--$n==0) $interPag=''; if (!$str) echo strtr($html.$interPag,$chiavi); else $str.=strtr($html.$interPag,$chiavi); } } else while (!$this->stampaunione->EOF) { $chiavi=$this->stampaunione->fields; $this->stampaunione->movenext(); if($this->stampaunione->EOF) $interPag=''; if (!$str) echo strtr($html.$interPag,$chiavi); $str.=strtr($html.$interPag,$chiavi); } return $str; } /** @access private */ function get_html($html='') { if (!$html) foreach ($this->attributi as $pag=>$vals) $html.="
".$this->attributi[$pag]['html']."
"; return $html; return MyExcel::assolutizza($html); } /** @access private */ function get_header($css=array()) { if (count($css)>0) foreach ($css as $nomecss) $CSS.=file_get_contents($nomecss); foreach ($this->attributi as $pag=>$vals) $sezioni.=$this->get_sezione($pag); return ' '; } /** @access private */ function prepara_testo($nomeFile,$css=array(),$html=''){ if (!$this->stampaunione){ $tutto=$this->get_header($css).''.$this->get_html($html).''; } else { $tutto=$this->get_header($css).''; $tutto=$this->stampa_unione($this->get_html($html),$tutto); $tutto.=''; } $id=$this->id; $tmp=new myMultiParter(); $tutto=$tmp->IncorporaImmagini(array('link'=>'href','img'=>'src'),$tutto); if ($this->xml) $this->xml=$tmp->IncorporaImmagini(array('link'=>'href','img'=>'src'),$this->xml); $a=new myMultiParter(); $a->AddStringImage($tutto,"","c:/$id/MyDoc.htm","quoted-printable",0,'inline_attach'); if ($this->xml) $a->AddStringImage($this->xml,'',"c:/$id/MyDoc_file/MyHeader.htm","quoted-printable"); $a->SetAttachments(array_merge( (array) $a->GetAttachments(), (array) $tmp->GetAttachments())); $a->Prepare(); return $a->CreateHeader().$a->CreateBody(); } /** Invia al client il file excel (determina la chiusura dello script) * @param string $nomeFile * @param array $css elenco dei nomi dei css da importare * @param string $html è l'html da usare per la creazione del xls in alternativa ai dati memorizzati * @param boolean $exit se è true viene eseguito un exit al termine della send, altrimenti lo script chiamante prosegue (in questo caso non dare echo o altre visualizzazioni dopo la send) */ function send($nomeFile,$css=array(),$html='',$exit=true) { // session_cache_limiter('private'); header("Pragma:"); header("Expires: " . gmdate("D, d M Y H:i:s",time()+30) . " GMT"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Content-disposition: attachment; filename=\"".basename($nomeFile)."\""); header("Content-Type: application/force-download");//header('Content-type: application/msword'); header("Content-Transfer-Encoding: binary"); if (!$this->stampaunione){ $tutto=$this->prepara_testo($nomeFile,$css,$html); header("Content-Length: ".strlen($tutto)); echo $tutto; } else { echo $this->prepara_testo($nomeFile,$css,$html); } if ($exit) exit; } /** Salva il file su disco, SCONSIGLIATO SE SI USA SET_INTESTAZIONE * @param string $nomeFile * @param array $css elenco dei nomi dei css da importare * @param string $html è l'html da usare per la creazione del xls in alternativa ai dati memorizzati */ function Save($nomeFile,$css=array(),$html='') { $f=fopen($nomeFile,'w'); fwrite($f,$this->prepara_testo($nomeFile,$css,$html)); fclose($f); exit; } } /** * @package myOffice * * Questa classe permette di creare dei file in html che Word sia in grado gestire, * l'uso migliore è la produzione di documenti destinati alla stampa. * Se tali doc dovranno essere archiviati NON inserire immagini nel documento o si * correrà il rischio che non saranno sempre visualizzati. * * //definisco due pagine con dei segnaposto che scelco essere della forma *parola* * $prima_pagina='
* Spett. *cognome* *nome*
*
*
* Le comunico che lei è .... *
'; * * $seconda_pagina='...*esito*'; * * //istanzio l'oggetto inizializzandolo con la prima pagina * $doc=new MyWord($prima_pagina); * * //aggiungo la seconda pagina * $doc->add_pagina($seconda_pagina); * * //dichiaro un array di valori in cui le chiavi corrispondono ai segnaposto * $destinatari=array(); * $destinatari[0]=array('*cognome*'=>'Gimigliano','*nome*'=>'Gianluca','*esito*'=>'Promosso'); * $destinatari[1]=array('*cognome*'=>'Rossi', '*nome*'=>'Guido', '*esito*'=>'Bocciato'); * $destinatari[2]=array('*cognome*'=>'Foti', '*nome*'=>'Carlo', '*esito*'=>'Non dico niente'); * * * //In alternativa va bene anche: * //$destinatari=$conn->execute("select cognome as '*cognome*' , nome as '*nome*' from persone "); * * * $doc->set_stampa_unione($destinatari); * * //scelgo un'intestazione ed un piè pagina che mi mette in basso a destra il numero di pagina * $doc->set_intestazione("Ministero Affari Inutili" , '
Pag.
'); * $doc->set_protezione(); * $doc->send('file.doc'); *
*/ class myCSV extends myTable { protected $separatori,$intestazioni=array(); function __construct($separatore=';',$quotatura='"',$accapo="\n") { $this->set_separatori($separatore,$quotatura,$accapo); } function load_from_file($file,$con_intestazione=true,$sep=";"){ if (!$sep) $sep=$this->sep; if (!($max=@filesize($file))) return; $f=fopen($file,'r'); if ($con_intestazione) $this->intestazione=(array) @fgetcsv($f,$max,$sep); while ($riga=@fgetcsv($f,$max,$sep)) $this->valori[]=$riga; @fclose($f); return true; } /** * Importa un myTable da html * Ecco come importare la seconda tabella contenuta in questo html e poi aggiungerci una riga * * $html=" * * * * *
AB
12
1122
* * * * * * * * * * * * * * * * * *
ABC
123
112233
"; * * $t=new myTable(); * $t->importa_html($html,2) * ->ins_row(array(111,222,333)); * echo $t; *
* * * @param string $html html da lavorare * @param int $quale numero d'ordine della tabella da importare * @param boolean $accoda se true accoda i valori a quelli correnti (ma solo per le prime n colonne dove n è il numero di colonne già in memoria) */ function importa_html(&$html,$quale=1,$accoda=false) { $t=strip_tags($html,'
'); $table=new myTable(); if($accoda) $table->set_matrix($this->get_matrix()); $this->Importa_MyTable($table->importa_html($t,$quale,true,true)); return $this; } function set_separatori($separatore=';',$quotatura='"',$accapo="\n"){ $this->separatori['sep']=$separatore; $this->separatori['quot']=$quotatura; $this->separatori['acc']=$accapo; return $this; } /** * Importa i dati da una myTable o sua estensione * * @param myTable $MyTable * @param array $colonne array con i numeri di colonna da importare, se omesso tutte * @param array $righe array con i numeri di riga da importare, se omesso tutte * @param boolean $intestazione se true importa anche le intestazioni * @param boolean $accoda se true accoda i valori a quelli correnti (ma solo per le prime n colonne dove n è il numero di colonne già in memoria) * @param boolean $usa_ricalcola_cella se false usa i valori originali altrimenti eventuali ridefinizioni di classe */ function Importa_MyTable($MyTable,$colonne='',$righe='',$intestazione=true,$accoda=false,$usa_ricalcola_cella=false) { if ($intestazione) $Intestazioni=$MyTable->get_intestazioni(); if(!$usa_ricalcola_cella) $matrice=$MyTable->get_matrix(); else {$matrice=array(); for ($j=0;$j<$MyTable->get_N_rows();$j++) if (!$righe || isset($righe[$j])) for($i=0;$i<$MyTable->get_N_cols();$i++) $matrice[$j][$i]=$MyTable->ricalcola_cella($j, $i); } if (!$this->get_n_rows() && (!$righe && !$colonne && !$accoda)) return $this->set_matrix($matrice,true,$Intestazioni); if ($righe) $righe=array_flip($righe); if (!$colonne) $colonne=array_keys($MyTable->get_row(0)); if (!($colonne_interne=array_keys((array) $this->get_row(0)))) $colonne_interne=array_keys($colonne); //se csv non inizializzato colonne_interne=colonne => colonne_comuni=colonne // foreach ($matrice as $j=>&$riga) if (!$righe || isset($righe[$j])) { $r=array(); foreach ($colonne_interne as &$i){$r[]=$riga[$colonne[$i]];} $this->ins_row($r); } if($Intestazioni) { $intestazioni=array(); foreach ($colonne_interne as &$i) $intestazioni[]=$Intestazioni[$colonne[$i]]; $this->set_intestazioni($intestazioni); } return $this; } /** @ignore */ protected function "a(&$x){ $x=html_entity_decode($x); if(strpos($x,$this->separatori['sep'])!==false) return $this->separatori['quot'].str_replace($this->separatori['quot'],$this->separatori['quot'].$this->separatori['quot'],$x).$this->separatori['quot']; else return $x; } function &genera(){ $intestazioni=$this->get_intestazioni(); if($intestazioni) { $ncols=count($intestazioni); foreach ($intestazioni as $col) { $out.=$this->quota($col); if(++$j<=$ncols) $out.=$this->separatori['sep']; } $out.=$this->separatori['acc']; } $n=count($this->valori); for ($i=0;$i<$n;$i++){ for ($j=0;$jvalori[$i]);$j++) {$out.=$this->quota($this->valori[$i][$j]); if($j+1<=count($this->valori[$i])) $out.=$this->separatori['sep']; } $out.=$this->separatori['acc']; } return $out; } function salva($file) { @file_put_contents($file,$this->genera(),LOCK_EX); } function send($nomeFile='file.csv',$forza_download=true,$abilita_gzip=false) { $tutto=&$this->genera(); header("Pragma:"); header("Expires: " . gmdate("D, d M Y H:i:s",time()+30) . " GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: private, must-revalidate, post-check=0, pre-check=0"); header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: binary"); if($forza_download) { header("Content-Type: application/csv"); header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: attachment; filename=\"".basename($nomeFile)."\""); } else {header("Content-Type: application/csv"); header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: inline; filename=\"".basename($nomeFile)."\""); } if($abilita_gzip && strlen($tutto)>1024 && strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') ) { header("Content-Encoding: gzip"); header("Original-Size: ".strlen($tutto)); $tutto= "\x1f\x8b\x08\x00\x00\x00\x00\x00". substr(gzcompress($tutto, 6), 0, - 4). pack('V', crc32($tutto)). pack('V', strlen($tutto)); } header("Content-Length: ".strlen($tutto)); echo $tutto; exit; } } ?>