November, 2008

Excel to PHP

Se mai întâmplă uneori să avem nevoia de a prelucra nişte date pe care le avem ţinute în fişiere excel. Dacă sunt câteva înregistrări e totul bine şi frumos, însă atunci când sunt la un loc câteva sute de înregistrări trebuie găsită o variantă mai uşoară pentru preluarea şi prelucrarea lor.

Să presupunem că avem următoarele înregistrări în fişierul nostru excel:

excel

Datele reprezintă nişte cărţi, coloanele însemnând: Titlu, Autor, Pagini, Editură şi Preţ.

Metoda pe care vă voi prezenta în cele ce urmează foloseşte extensia de care v-am mai vorbit acum ceva vreme, DOM. După cum spuneam şi atunci, DOM prelucrează fişiere XML. Aşadar primul pas pe care trebuie să-l facem este de a salva fişierul excel ca „XML Spreadsheet”.

Fişierul în cauză conţine foarte multe taguri, însă partea care ne interesează pe noi este următoarea:





Enigma Otiliei
George Calinescu
401
Eminescu
20.440000000000001


La Tiganci
Mircea Eliade
188
Tana
9


Jocul Ielelor
Camil Petrescu
384
Gramar
15

3 11 8 False False
False False
False False

Datele noastre sunt aflate în interiorul tagurilor „Worksheet”. În funcţie de câte sheet-uri avem în documentul excel, atâtea taguri worksheet va conţine şi fişierul nostru xml. În cadrul fiecărui Worksheet avem tagul „Table” cu ale lui „Row” (linie) şi „Cell” (coloană). În funcţie de câte linii aveam completate în document, tot atâtea taguri „Row” vom avea şi în interiorul tagului „Table”.  Valorile fiecărei coloane sunt stocate în interiorul tagului „Data”.

Ok, să ne întoarcem acum la fişierul php. Pentru început declarăm array-ul în care stocăm înregistrările şi declarăm o funcţie pentru adăugarea lor mai uşoară în acest tablou.

 $titlu,
'autor' => $autor,
'pagini' => $pagini,
'editura' => $editura,
'pret' => $pret
);
}
?>

Următorul pas este citirea documentului nostru şi a tagurilor (liniile tabelului) „Row”.

load( 'Book1.xml' );

$rows = $xml->getElementsByTagName( 'Row' );
?>

După ce am citit toate liniile tabelului, pentru fiecare în parte căutăm coloanele (tagurile „Cell”). În acest moment trebuie să ne dăm seama în care coloană ne aflăm. Tagul „Cell” are un atribut „ss:Index„ care ne indică poziţia în cazul în care sunt coloane goale pe linia curentă.

getElementsByTagName( 'Cell' );

foreach ( $cells as $cell )
{
$ind = $cell->getAttribute( 'Index' );

if ( $ind != null ) $index = $ind;

if ( $index == 1 ) $titlu      = $cell->nodeValue;
if ( $index == 2 ) $autor      = $cell->nodeValue;
if ( $index == 3 ) $pagini   = $cell->nodeValue;
if ( $index == 4 ) $editura  = $cell->nodeValue;
if ( $index == 5 ) $pret     = $cell->nodeValue;

$index += 1;
}

adauga_carte( $titlu, $autor, $pagini, $editura, $pret );
}

$first_row = false;
}
?>

În acest moment array-ul nostru conţine toate înregistrările din fişierul sursă. Dacă dorim să-l vizualizăm pe ecran pentru verificare, putem pur şi simplu să-l afişăm sub formă de tabel stil excel:



titlu:
autor:
pagini:
editura:
pret:


';

foreach ( $data as $row )
{
echo '

' . $row['titlu'] . '
' . $row['autor'] . '
' . $row['pagini'] . '
' . $row['editura'] . '
' . $row['pret'] . '


';
}

echo '

';
?>

Dacă totul este în regulă, îl inserăm în baza de date:


Cam asta este procedura pe care eu o folosesc atunci când trebuie să lucrez cu fişierele excel. Este un procedeu de bază realizat pentru un caz particular. Evident se poate îmbunătăţi considerabil, însă nu acesta era scopul exemplului.

Tags: , ,
Posted in Articole, PHP No Comments »

Probabil bug ?!

iată ce mesaj mă întâmpină când fac o căutare pe www.hmultiplex.ro după termenul „madagascar 2”.

hmultiplex

e cum poate fi asta XSS ?!?!! are you kidding me? nu ştiu cine a făcut implementarea, dar sigur a scăpat ceva…

Tags: , ,
Posted in World Wide Web No Comments »

New books in town

azi mi-au sosit şi ultimele 2 cărţi din cele 4 pe care le comandasem cu vreo lună înainte (happy happy, joy joy :D ).

books

books

poate o să fac şi nişte review-uri la ele în funcţie de cum le termin de citit ;) .

Tags: , , ,
Posted in Carti, Despre mine 1 Comment »

DOM vs. SimpleXML partea 2

Ca urmare a ultimului articol, voi continua acum descrierea modalităţilor de lucru cu xml din php. De această dată este vorba de DOM.

Parserele de tip DOM construiesc în memorie întregul arbore de resurse. Acesta poate fi ulterior parcurs, şters, modificat, adăugat. Un avantaj al DOM constă în flexibilitatea mai mare oferită faţă de SimpleXML, cu preţul unei complexităţi sporite.

Extensia DOM (specifică php5) este exclusiv orientată pe obiecte. Principala clasă este DOMNode, din care derivă DOMDocument, DOMElement, DOMAttr, DOMComment, DOMText. Celelalte două clase disponibile sunt DOMNodeList şi DOMXPath.

Încărcarea codului xml se poate face din fişier sau string, prin instanţierea unui obiect de tip DOMDocument urmat de apelarea metodelor de încărcare: load şi loadHTMLFile (din fişier), respectiv loadHTML şi loadXML (din string).

$xml = new DOMDocument();

$xml->load("fisier.xml");

$xml->load("http://adresa_web/fisier.xml");

$string = file_get_contents("fisier.xml");

$xml->loadXML($string);

Parcurgerea unui arbore de tip DOM şi accesul la resurse se face printr-o multitudine de metode şi câmpuri puse la dispoziţie de toate clasele DOM. Lista lor este foarte mare şi de aceea voi menţiona doar câteva, cele mai importante.

Să luăm drept exemplu acelaşi fişier ca şi în prima parte a articolului:




unitatea 0


unitatea 1
1500 lei


unitatea 2
1200 lei


unitatea 3
3500 lei


Parcurgerea acestui fişier se poate face în felul următor:

$xml = new DOMDocument();

$xml->load("fisier_de_mai_sus.xml");

echo $xml->nodeName; // afiseaza #document

echo $xml->firstChild->nodeName; // afiseaza unitati

echo $xml->firstChild->firstChild->nodeName; // afiseaza server

foreach ( $xml->firstChild->childNodes as $s) echo $s->nodeName . " "; // afiseaza server calculator calculator calculator

foreach ( $xml->DocumentElement as $nod )
{
echo $nod->nodeName;

if ( $nod->hasAttributes() )
{
foreach ( $nod->attributes as $a )
{
echo $a->name . ": " . $a->value . "
"; //afiseaza nume_atribut: valoare_atribut } } echo "
"; }

Bun, acum să luăm pe rând să vedem ce am folosit mai sus pentru parsarea fişierului.

  • Câmpul nodeName din clasa DOMNode afişează numele nodului. Pentru elemente returnează numele tagului, iar pentru noduri text #text.
  • Câmpul firstChild ( sau lastChild ) desemnează primul/ultimul nod copil al nodului curent
  • childNodes returnează lista de noduri copil
  • documentElement returnează elementul rădăcină al fişierului xml
  • metoda hasAttributes returnează true/false dacă elementul are atribute sau nu
  • Câmpul attributes returnează lista de atribute ale unui nod, sub forma unui obiect iterabil. pentru afisarea lor se folosesc câmpurile clasei DOMAttr, name şi value.

De asemenea se pot adăuga noduri la obiectul curent prin metodele clasei DOMNode, appendChild sau insertBefore, iar asocierea de atribute se poate face prin metoda setAttribute, a clasei DOMElement.

Dacă dorim, putem crea de la zero un document xml folosind metoda createElement a clasei DOMDocument, pentru crearea de elemente, createAttribute, pentru adăugare de atribute şi createTextNode, pentru adăugarea de PCDATA.

Spuneam la început că se pot folosi şi interogări XPath pentru parcurgerea codului XML. Clasa care ajută la acest lucru este DOMXPath. Prinicipala metodă a acestei clase este query, care primeşte ca argument expresia XPath şi returnează nodurile găsite sub forma unui obiect de tip DOMNodeList ce se poate itera.

Extensia DOM este foarte puternică pentru lucrul cu fişiere XML şi din acest motiv, foarte complexă. Dacă doriţi să cunoaşteţi mai multe desprea ea puteţi să începeţi cu documentaţia de pe site-ul oficial.

Tags: , , ,
Posted in Articole, PHP 1 Comment »