<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marius Barbulescu &#124; Freshcolors &#187; excel</title>
	<atom:link href="http://www.freshcolors.ro/blog/tag/excel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.freshcolors.ro/blog</link>
	<description>Vor încerca să ne-ntreacă, dar n-o să poată…</description>
	<lastBuildDate>Sat, 03 Jul 2010 10:45:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Excel to PHP</title>
		<link>http://www.freshcolors.ro/blog/2008/11/28/excel-to-php/</link>
		<comments>http://www.freshcolors.ro/blog/2008/11/28/excel-to-php/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 10:05:53 +0000</pubDate>
		<dc:creator>M.B.</dc:creator>
				<category><![CDATA[Articole]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://misterjinx.wordpress.com/?p=143</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>Să presupunem că avem următoarele înregistrări în fişierul nostru excel:</p>
<pre><a href="http://misterjinx.files.wordpress.com/2008/11/excel.gif"><img class="aligncenter size-full wp-image-146" title="excel" src="http://misterjinx.files.wordpress.com/2008/11/excel.gif" alt="excel" width="480" height="72" /></a></pre>
<p>Datele reprezintă nişte cărţi, coloanele însemnând: Titlu, Autor, Pagini, Editură şi Preţ.</p>
<p>Metoda pe care vă voi prezenta în cele ce urmează foloseşte extensia de care v-am mai vorbit acum ceva vreme, <a title="DOM" href="http://misterjinx.wordpress.com/2008/11/02/dom-vs-simplexml-partea-2/" target="_blank">DOM</a>. 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”.</p>
<p>Fişierul în cauză conţine foarte multe taguri, însă partea care ne interesează pe noi este următoarea:</p>
<pre class="brush:xml">
<worksheet ss:Name="Sheet1">
<table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="4" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<column ss:Index="2" ss:AutoFitWidth="0" ss:Width="73.5"/>
<column ss:AutoFitWidth="0" ss:Width="102.75"/>
<row ss:Index="2">
<cell ss:Index="2"><data ss:Type="String">Enigma Otiliei</data></cell>
<cell><data ss:Type="String">George Calinescu</data></cell>
<cell><data ss:Type="Number">401</data></cell>
<cell><data ss:Type="String">Eminescu</data></cell>
<cell><data ss:Type="Number">20.440000000000001</data></cell>
</row>
<row>
<cell ss:Index="2"><data ss:Type="String">La Tiganci</data></cell>
<cell><data ss:Type="String">Mircea Eliade</data></cell>
<cell><data ss:Type="Number">188</data></cell>
<cell><data ss:Type="String">Tana</data></cell>
<cell><data ss:Type="Number">9</data></cell>
</row>
<row>
<cell ss:Index="2"><data ss:Type="String">Jocul Ielelor</data></cell>
<cell><data ss:Type="String">Camil Petrescu</data></cell>
<cell><data ss:Type="Number">384</data></cell>
<cell><data ss:Type="String">Gramar</data></cell>
<cell><data ss:Type="Number">15</data></cell>
</row>
</table>

<worksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<pageSetup>
<header x:Margin="0.3"/>
<footer x:Margin="0.3"/>
<pageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</pageSetup>
<selected/>
<panes>
<pane>
<number>3</number>
<activeRow>11</activeRow>
<activeCol>8</activeCol>
</pane>
</panes>
<protectObjects>False</protectObjects>
<protectScenarios>False</protectScenarios>
</worksheetOptions>
</worksheet>
<worksheet ss:Name="Sheet2">
<table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
</table>

<worksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<pageSetup>
<header x:Margin="0.3"/>
<footer x:Margin="0.3"/>
<pageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</pageSetup>
<protectObjects>False</protectObjects>
<protectScenarios>False</protectScenarios>
</worksheetOptions>
</worksheet>
<worksheet ss:Name="Sheet3">
<table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
</table>

<worksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<pageSetup>
<header x:Margin="0.3"/>
<footer x:Margin="0.3"/>
<pageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</pageSetup>
<protectObjects>False</protectObjects>
<protectScenarios>False</protectScenarios>
</worksheetOptions>
</worksheet>
</pre>
<p>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”.</p>
<p>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.</p>
<pre class="brush:php">
$data = array();

function adauga_carte( $titlu, $autor, $pagini, $editura, $pret )
{
global $data;

$data[] = array( 'titlu' => $titlu,
'autor' => $autor,
'pagini' => $pagini,
'editura' => $editura,
'pret' => $pret
);
}
</pre>
<p>Următorul pas este citirea documentului nostru şi a tagurilor (liniile tabelului) „Row”.</p>
<pre class="brush:php">
$dom = new DOMDocument();
$xml = $dom->load( 'Book1.xml' );

$rows = $xml->getElementsByTagName( 'Row' );
</pre>
<p>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ă.</p>
<pre class="brush:php">
//prima linie este ignorată

$first_row = true;

foreach ( $rows as $row )
{
if ( ! $first_row )
{
$titlu    = "";
$autor    = "";
$pagini   = "";
$editura  = "";
$pret     = "";
$index = 1;

$cells = $row->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;
}
</pre>
<p>Î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:</p>
<pre class="brush:php">
echo '
<table border="1">
<tr>
<td><b>titlu:</b></td>
<td><b>autor:</b></td>
<td><b>pagini:</b></td>
<td><b>editura:</b></td>
<td><b>pret:</b></td>
</tr>

';

foreach ( $data as $row )
{
echo '
<tr>
<td>' . $row['titlu'] . '</td>
<td>' . $row['autor'] . '</td>
<td>' . $row['pagini'] . '</td>
<td>' . $row['editura'] . '</td>
<td>' . $row['pret'] . '</td>
</tr>

';
}

echo '</table>

';
</pre>
<p>Dacă totul este în regulă, îl inserăm în baza de date:</p>
<pre class="brush:php">
mysql_connect( "localhost", "user", "pass" );
mysql_select_db( "db_name" );

$i = 0;

foreach ( $data as $row )
{
$inserted = mysql_query( "INSERT INTO `carti` ( titlu, autor, pagini, editura, pret )
VALUES ( '".$row['titlu']."', '".$row['autor']."', '".$row['pagini']."', '".$row['editura']."', '".$row['pret']."' )"
);

if ( $inserted ) $i++;
}

echo 'Au fost introduse ' . $i . ' carti.';
</pre>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freshcolors.ro/blog/2008/11/28/excel-to-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
