Está en la página 1de 8

GENERAR

SPREADSHEETS

ODS

CON

PHP

Autor | fetux
http://www.siemprecontralacorriente.com/

v. 0.0.2

Copyleft bajo la licencia GN !"# $%.& http://www.fsf.or'/news/f(l)%.&)pr.html/

GENERAR

SPREADSHEETS

ODS

CON

PHP

INTRODUCCIN
*uchas veces necesitamos 'enerar reportes o hojas (e c+lculo mas complejas a partir (e (atos ,ue manejamos (es(e nuestra aplicaci-n web. .n este pe,ue/o manual vamos a ver como lo'rarlo0 mostran(o tambien al'unos ejemplos pr+cticos. 1(s2hpGenerator es una librer3a escrita por #aurent $uibert0 http://o(sphp'enerator.lapinator.net/0 en 2425 para 'enerar hojas (e c+lculo (e 1pen"ocument0 http://www.openoffice.or'/. #a librer3a provee las clases0 m6to(os0 y propie(a(es necesarias para crear (ocumentos realmente complejos. Necesitaremos para esto: 1(s2hpGenerator0 24250 "1*0 y 782.

DIBUJANDO LA ESTRUCTURA DE LA PLANILLA


#o primero ,ue (ebemos hacer es incluir la librer3a en nuestro script: require_once(ods/ods.php); #ue'o creamos una objeto 9instancia: (e la clase o(s con la funci-n new (el si'uiente mo(o: $ods = new ods(); Ahora nuestro objeto ,ue se almacena en la variable ;o(s nos servir+ por ejemplo para incrustar la tablas ,ue creemos en la planilla (e c+lculo0 o para crear nuestro archivo o(s al final0 pero primero creamos las tablas0 las filas y las cel(as. $table = new odsTable( !iTabla ); $row = new odsTable"ow(); Al i'ual ,ue creamos nuestra objeto (e planilla (e c+lculo0 ahora creamos <mi=abla>0 solo ,ue a partir (e la clase o(s=able. #ue'o instanciamos i'ual tambi6n un objeto0 ;row0 (e la clase o(s=able?ow para nuestra primer fila. 4asta el momento tenemos & nuevos objetos. !altar3a crear el objeto (e cel(a. .l cual lo haremos (irectamente en la misma l3nea (on(e lo vamos a incrustar0 con new odsTableCellString(). 1bviamente0 las cel(as se incrustan en las filas0 y las filas en las tablas0 por ultimo las tablas se incrustan en nuestro objeto (e la clase o(s. 2ara esto contamos con & m6to(os respectivamente: a((Cell (e la clase o(s=able?ow@ a((?ow (e la clase o(s=able@ y a((=able (e la clase o(s. $row#$add%ell( new odsTable%ell&trin'( (ola )undo* ) ); $table#$add"ow($row); $ods#$addTable($table); 2or Altimo0 po(emos crear el archivo B.o(s con el m6to(o (ownloa(1(s!ile9: (e la clase o(s. $ods#$download+ds,ile( (ola)undo.ods ); C%

GENERAR

SPREADSHEETS

ODS

CON

PHP

Figura 1. HolaMundo.ods

.n el caso (e necesitar ,ue nuestra planilla ten'a mas (e una tabla tenemos ,ue crear tantos objetos como (eseemos (e la clase o(s=able. No olvi(arse (e incrustar las tablas al terminar0 antes (e invocar (ownloa(1(s!ile. Al'o interesante es ,ue con el m6to(o Det"efault=able (e la clase o(s po(emos (efinir ,ue tabla se mostrara primero cuan(o se abra la hoja (e c+lculo. $ods#$set-efaultTable($!iTabla);

Figura 2. OdsPhpGenerator nos permite seleccionar que tabla queremos que se muestre por defecto al abrir el documento.

FORMATO DE CELDAS
4ay varias opciones para (ar formato a las cel(as. .n teor3a hay %2 tipos (e cel(as: vac3a@ ca(ena (e teEto@ correo electr-nico@ ?#@ numero real@ fecha@ hora@ fecha/hora@ euro@ (-lar@ libra@ ima'en@ Di notamos como habiamos crea(o nuestra primer cel(a0 lo habiamos hecho con new o(s=ableCellDtrin'9: C2

GENERAR

SPREADSHEETS

ODS

CON

PHP

como par+metro (el m6to(o a((Cell. Fste m6to(o tiene un par+metro ,ue es un objeto ,ue represente justo el tipo (e cel(a ,ue ,ueremos crear: // .l par/!etro de esta instanciaci0n es el dato que contiene la celda new odsTable%ell&trin'( (ola )undo* ) As3 como la clase o(s=ableCellDtrin' es para ca(enas (e teEto0 tenemos una clase para ca(a tipo. ejemplo para afianGar esto: 12php require_once( ods/ods.php ); $ods = new ods(); $table = new odsTable( !iTabla%on,or!ato ); $row = new odsTable"ow(); $row#$add%ell( new odsTable%ell&trin'( (ola )undo* ) ); $row#$add%ell( new odsTable%ell.!pt3() ); $row#$add%ell( new odsTable%ell&trin'.!ail( fetux4'!ail.co! ) ); $row#$add%ell( new odsTable%ell&trin'5rl( http6//www.fetux.co!/ ) ); $row#$add%ell( new odsTable%ell,loat(7.898:) ); $row#$add%ell( new odsTable%ell-ate(date( ;#!#d )< ))--;;;; ) ); $row#$add%ell( new odsTable%ellTi!e( =T>?(7?):?& < (())&&@)=) ) ); $row#$add%ell( new odsTable%ell-ateTi!e(date( ;#!#d ). T>?67?6:? < ))--;;(())&& ) ); $row#$add%ell( new odsTable%ell%urrenc3(8??< 5&- ) ); // 5&- o .5" o AB= $row#$add%ell( new odsTable%ellC!a'e( i!'/lo'o.pn' ) ); $table#$add"ow($row); $ods#$addTable($table); $ods#$download+ds,ile( Tipo-e%eldas.ods ); 2$ n pe,ue/o

ESTILOS

DE CELDA

.l formato (e las cel(as va mucho mas all+ (el tipo ,ue se le asi'ne a ca(a cel(a. 2o(emos (ar formato (es(e el estilo (e las cel(as. Cuan(o hablo (e estilo me refiero a color (el teEto0 el color (e fon(o 9bacH'roun(: (e una cel(a0 a los bor(es0 alineaci-n0 fuente0 tama/o (e la fuente0 y a los estilos conoci(os como ne'rita0 cursiva0 y subraya(o. 4ay al'o importante a tener en cuenta y ,ue (iferencia entre (ar un tipo y (ar un estilo a una cel(a. Como vimos0 para ,ue una cel(a sea (e un tipo (ebe crearse un objeto (e una clase especifica para ca(a tipo (e cel(a ,ue po(emos crear. Ahora bien0 para (ar este tipo (e formato con estos estilos0 (ebemos a're'ar como Altimo par+metro (e ese objeto0 un objeto (e la clase o(sDtyle=ableCell. Fsta clase es la ,ue contiene to(os estos estilos. .n (efinitiva se crea0 en primer lu'ar0 un objeto con to(os los estilos ,ue ,ueremos a'rupar0 y lue'o se aplican esos estilos a una cel(a. $amos a ver un ejemplo para aclarar este remolino (e palabras. 12php C&

GENERAR

SPREADSHEETS

ODS

CON

PHP

require_once(ods/ods.php); $ods = new ods(); $st3le = new ods&t3leTable%ell(); $st3le#$set%olor(Dff????E); $st3le#$setBacF'round%olor(D??ff??E); $st3le#$setBorder(?.?8c! solid D????ff); $st3le#$setText@li'n(center); // start G center G end G Hustif3 $st3le#$set,ontIie'ht(bold); // bold G nor!al $st3le#$set,ont&t3le(italic); // italic G nor!al $st3le#$set5nderline(Jfont#colorK); // font#color G D??????E G null $st3le#$set,ont&iLe(J8MptK); //&eleccionar el tipo de letra $Ti!esNew"o!an = new ods,ont,ace(Ti!es New "o!an); $ods = add,ont,aces($Ti!esNew"o!an); $st3le#$set,ont,ace($Ti!esNew"o!an); $table = new odsTable(ods&t3leTable%ell); $table#$add"ow($row = new odsTable"ow()); $row#$add%ell( new odsTable%ell&trin'(J)i celda con for!atoK< $st3le)); $ods#$addTable($table); $ods#$download+ds,ile(JTabla%on,or!ato.odsK); 2$ Creo ,ue con esto ya tenemos un comienGo para empeGar a ver como funciona esto (e crear planillas (e calculo 1"D (es(e 242. =o(avia nos falta0 un poco mas sobre el formato0 creo ,ue es un 'ran tema. De'uro tambien falta muchas cosas ,ue la librer3a no ha resuelto0 pero esperemos se pue(a lo'rar. #o ,ue si vamos a ver es un poco es como hacer para combinar cel(as0 o fijar ancho (e columnas0 y al'unos eEtras antes (e ver ,ue es lo ,ue propone lalibrer3a para manejar al'o fun(amental ,ue son las f-rmulas.

FORMATO AVANZADO DE CELDAS


IuiGas lo mas comAn es ,ue ,uerramos ,ue no to(as las columnas ten'an el mismo ancho. 2ero hay ,ue tener varias cosas presentes al momento (e (eci(ir si mo(ificar el ancho (e una columna o (e combinar cel(as por ejemplo. A mi enten(er y en mi eEperiencia con hojas (e c+lculo (ebemos mo(iciar el ancho (e las columnas y combinar cel(as lo menos posible. 2ero a veces es estrictamente necesario. 2or ejemplo en el caso ,ue la lon'itu( (e un numero no entre en el tama/o por (efecto aparecer+n en su lu'ar varios CCCCC. No suce(e lo mismo con las ca(enas (e teEto0 en cambio0 si las cel(as conti'uas ,ue ocupan la cen(ena estan vacias esta se mostrara sin problemas. .l planillas con muchas cel(as combina(as0 y muchas cel(as en 'eneral es (ificil hacer mo(ificaciones sobre la estructura. .n f3n0 el (ise/o0 tanto la estructura como el formato (e la hoja (e c+lculo0 es muy importante y hay ,ue tenerlo bien claro a la hora (e 'enerar el c-(i'o.

MODIFICAR

EL ANCHO DE UNA COLUMNA

Aparecen una nueva clase: o(sDtyle=ableColumn0 para (efinir estilos (e columna. Fsta clase tiene el m6to(o setColumnJi(th0 ,ue tiene como par+metro el tama/o (el ancho (e la columna. CK

GENERAR

SPREADSHEETS

ODS

CON

PHP

$st3le%olu!n = new ods&t3leTable%olu!n(); $st3le%olu!n#$set%olu!nIidth(O:c!O); Como teniamos nuestro o(s=able?ow0 tambi6n tenemos o(s=ableColumn0 y como par+metro le pasamos nuestro estilo crea(o. $colu!n = new odsTable%olu!n($st3le%olu!n); "e esperar0 otro m6to(o (e la clase o(s=able es a((=ableColumn. L i'ual ,ue a((=able?ow se pue(en incrustar cuentas columnas0 en este caso0 necesitemos. // @'re'o dos colu!nas de : c!. $table#$addTable%olu!n($colu!n); $table#$addTable%olu!n($colu!n); =ener en cuenta ,ue si el ancho es (istinto0 (ebemos crear un nuevo estilo.

COMBINAR

CELDAS

=enemos el setNumberColumnsDpanne( y setNumber?owsDpanne( para combinar cel(as horiGontal y verticalmente. $row = new odsTable"ow(); $cell = new odsTable%ell&trin'( %o!bino 9 celdas horiLontal!ente ); $cell#$setNu!ber%olu!ns&panned(9); $row#$add%ell( $cell ); $table#$add"ow($row); $row = new odsTable"ow(); $cell = new odsTable%ell&trin'( %o!bino 9 celdas Pertical!ente ); $cell#$setNu!ber"ows&panned(9); $row#$add%ell( $cell ); $table#$add"ow($row); // @'re'o celdas con ods%oPeredTable%ell en las que co!bine excepto la pri!era //for de n#8 for($i=?; $i17; $iQQ) R $row = new odsTable"ow(); $row#$add%ell( new ods%oPeredTable%ell() ); $table#$add"ow($row); S $eamos ,ue suce(e con este c-(i'o. 2rimero creamos una fila con new odsTableRow(), lue'o creamos una cel(a (e tipo string. Como vemos0 el m6to(o setNumberColumnsSpanned() tiene como par+metro el nAmero (e cel(as 9hacia la (erecha: a combinar. Como ya vimos insertamos la cel(a en la fila0 y lue'o la fila en la tabla. 2ara combinar cel(as verticalmente hay unas l3neas mas ,ue (ebemos a're'ar. Cuan(o invocamos setNumberRowsSpanned() con la canti(a( (e cel(as 9hacia abajo: a combinar0 solo informamos ,ue se combinaran esas cel(as0 pero creamos las filas ,ue las contienen. 2or eso (ebemos crearlas0 y utiliGar C5

GENERAR

SPREADSHEETS

ODS

CON

PHP

odsCoveredTableCell() para saber ,ue es una cel(a combina(a. Como vemos lo hacemos con un for (e n )% filas. Ahora veremos al'o un poco mas interesante. Combinar un 'rupo (e cel(as (e n filas B n columnas. 2or ejemplo: K B K $row = new odsTable"ow(); $cell = new odsTable%ell&trin'( %o!bino 9T9 ); $cell#$setNu!ber%olu!ns&panned(9); $cell#$setNu!ber"ows&panned(9); $row#$add%ell( $cell ); $table#$add"ow($row); for($i=?; $i17; $iQQ) R $row = new odsTable"ow(); $row#$add%ell( new ods%oPeredTable%ell() ); $row#$add%ell( new ods%oPeredTable%ell() ); $row#$add%ell( new ods%oPeredTable%ell() ); $row#$add%ell( new ods%oPeredTable%ell() ); $table#$add"ow($row); S $eamos el for: en este caso el for si'ue sien(o (e n )% filas0 pero pero en lu'ar (e a're'ar una cel(a por ca(a vuelta (el for0 a're'amos K 9canti(a( (e columnas:.

FRMULAS
Creo ,ue las f-rmulas son fun(amentales en las hojas (e c+lculo. ?ealmente per(er3a mucho senti(o si no eEistiencen. 4ay muchas f-rmulas ,ue po(emos aplicar a nuestras cel(as. 1(s2hpGenerator tiene soporte0 hasta el momento0 para al'una (e ellas.

SUMA
// %reo 8? filas. .n las celdas un nu!ero rando! . Cnserto las filas for($i=?; $i18?; $iQQ) R $row = new odsTable"ow(); $row#$add%ell( new odsTable%ell,loat(rand(?<:?))); $table#$add"ow($row); S // %reo una nuePa fila< 3 una celda para la f0r!ula $row = new odsTable"ow(); $cell = new odsTable%ell,loat(?); $cell#$set,or!ula(O&5)(U.@86.@8?V)O); CM

GENERAR

SPREADSHEETS

ODS

CON

PHP

$row#$add%ell( $cell ); $table#$add"ow($row);

CONCATENACIN
2ara la concatenaci-n el proce(imiento es el mismo0 ten(riamos ,ue usar por ejemplo: $cell#$set,or!ula( %+N%@T.N@T.(U.@>8V;O O;U.%8:V;O texto O;U.B8?V) );

PROPIEDADES DE LA HOJA DE CLCULO


1(s2hpGenerator nos (a la posibili(a( (e mo(ificar al'unas propie(a(es (e la hoja (e c+lculo (on(e estamos trabajan(o. .n 1pen1ffice.or' Calc0 estas propie(a(es son accesibles (es(e Archivo ) 2ropie(a(es ) "escripci-n. require_once( ods/ods.php ); $ods = new ods(); $ods#$setTitle(OTitulo de la hoHa de c/lculoO); $ods#$set&ubHect(OTe!a de la hoHa de c/lculoO); $ods#$setWe3word(O!anual<ods<phpO); $ods#$set-escription(O-escripci0nO);

...RESUMEN
.n este pu,ue/o manual vimos lo ,ue necesitamos para crear una hoja (e c+lculo b+sica. 4a'o referencia a crear filas0 crear cel(as0 (ar formato a estas cel(as0 ya sea el tipo (e (ato ,ue contienen0 o el estilo. 2or otro la(o vimos el ancho (e las columnas y como combinar cel(as. L terminamos con al'o (e cel(as ,ue contienen f-rmulas. Aun,ue (epen(emos (el (esarrollo (e la librer3a 1(s2hpGenerator v 0.0.20 versi-n con la ,ue contamos hoy0 ,ue(a en nuestra habili(a( (e pro'rama(ores (e crear soluciones eficientes.

APENDICE: Referenc ! "e f#nc $ne%


class o(sN public function

CO

También podría gustarte