<?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>UZED &#187; XML</title>
	<atom:link href="http://uzed.com.br/tag/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://uzed.com.br</link>
	<description>Informação Livre!</description>
	<lastBuildDate>Wed, 14 Jul 2010 06:03:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Manipulando arquivos ODS do OpenOffice com PHP</title>
		<link>http://uzed.com.br/manipulando-ods-com-php/</link>
		<comments>http://uzed.com.br/manipulando-ods-com-php/#comments</comments>
		<pubDate>Tue, 10 Jul 2007 02:14:24 +0000</pubDate>
		<dc:creator>zedmaster</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ODS]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://uzed.com.br/?p=14</guid>
		<description><![CDATA[Introdução O arquivo no formato .ods é da especificação aberta ODF (Open Document Format), uma alternativa livre de formatos de pacotes office. O arquivo .ods nada mais é que uma compactação em formato ZIP usado para armazenar a estrutura de planilhas . Pode ser manipulado com a biblioteca ZZIPlib do PHP. Já os arquivos descompactados [...]]]></description>
			<content:encoded><![CDATA[<h3>Introdução</h3>
<p>O arquivo no formato .ods é da especificação aberta <a href="http://www.odfalliance.org/">ODF</a> (Open Document Format), uma alternativa livre de formatos de pacotes office.<br />
O arquivo .ods nada mais é que uma compactação em formato ZIP usado para armazenar a estrutura de planilhas . Pode ser manipulado com a biblioteca <a href="http://www.php.net/manual/pt_BR/ref.zip.php">ZZIPlib</a> do PHP.<br />
Já os arquivos descompactados são a estrutura do formato ODS, como as imagens e os arquivos XML que contém folhas de estilo, scripts e o conteúdo.<br />
Aqui o que nos interessa é o arquivo content.xml, o qual iremos manipular o seu conteúdo usando <a href="http://www.php.net/manual/pt_BR/ref.dom.php">DOM</a> (nativo no PHP5 ou DOM XML no PHP4).</p>
<p>Felizmente para usuários MS OFFICE existe agora um plug-in desenvolvido pela SUN que conseque importar e exportar arquivos  <a href="http://www.odfalliance.org/">ODF</a> (no nosso caso iremos usar apenas o ODS). Eu particularmente uso o <a href="http://www.openoffice.org/">OpenOffice</a> que me demonstrou obter todos os resultados que eu precisei ate hoje.<br />
Mas para quem usa somente o MS Office segue o link para download:<br />
<a href="http://www.sun.com/software/star/openoffice/">http://www.sun.com/software/star/openoffice/</a></p>
<h3>Objetivo</h3>
<p>Abrir um arquivo .ods usado como template, copia-lo em uma outra pasta, inserir uma sequência de dados e fecha-lo.</p>
<h3>Problema</h3>
<p>Não salvar o conteúdo no arquivo de template, e sim usar uma copia dele.</p>
<h3>Solução</h3>
<p>- Fazer uma cópia do arquivo na pasta destino.<br />
- Abrir o arquivo XML dentro do arquivo .ods.<br />
- Manipular os dados usando DOM.<br />
- Salvar o arquivo no .ods.</p>
<h3>Código</h3>
<pre lang="PHP" line="1">
< ?php
class ODS
{
    public $fileTemplate; //Caminho do template
    public $fileSave; //Caminho do destino
    public $ods; // Instancia ODS
    public $dom; // Instância do objeto DOM
    private $tebleModel;

    /*public function __construct($fileTemplate, $fileSave){{{*/
    /*
     * Construtor da classe.
     * Configura as variáveis da classe.
     */
    public function __construct($fileTemplate, $fileSave)
    {
        $this->fileTemplate = $fileTemplate;
        $this->fileSave = $fileSave;
    }
    /*}}}*/

    /*public function make($data){{{*/
    /*
     * Método que utiliza o Padrão Gabarito.
     *
     * Métodos:
     *     - Abre o arquivo de template e cria objeto DOM.
     *     - Adiciona os valores na estrutura DOM.
     *     - Salva o novo arquivo .ods com as modificações.
     */
    public function make($data)
    {
        $this->openTemplate();
        $this->addData($data);
        $this->save();
    }
    /*}}}*/

    /*protected function openTemplate(){{{*/
    /*
     * Abre o arquivo template.ods retira o content.xml e cria o objeto DOM.
     */
    protected function openTemplate()
    {
        $zip = new ZipArchive;
        $res = $zip->open($this->fileTemplate, ZipArchive::CREATE); // Abre o arquivo de template
        $fp = $zip->getStream("content.xml"); // Pega o arquivo content.xml
        if(!$fp) exit("failed open".$this->fileTemplate."\n");

        while(!feof($fp)) {
            $contents .= fread($fp, 2); // Pega o conteúdo do arquivo;
        }
        fclose($fp);
        $zip->close();

        // Pega o conteúdo XML e instancia o objeto DOM.
        $this->dom = new DOMDocument();
        $this->dom->loadXML($contents);

    }
    /*}}}*/
    /*protected function addData($data){{{*/
    /*
     * Adiciona os valores na estrutura DOM.
     */
    protected function addData($data)
    {
        $table = $this->dom->getElementsByTagName("table");

        foreach($data as $rowVal)
        {
            $nodeRow  = $this->dom->createElement("table:table-row");
            $nodeRow->setAttribute("table:style-name","ro1");

            foreach($rowVal as $colVal)
            {
                $nodeText = $this->dom->createElement("text:p",$colVal);
                $nodeCell = $this->dom->createElement("table:table-cell");
                $nodeCell->setAttribute("table:style-name","ce2");
                $nodeCell->setAttribute("office:value-type","string");

                $nodeCell->appendChild($nodeText);
                $nodeRow->appendChild($nodeCell);

                $text .= ", ".$colVal;
            }
            echo ++$i.$text."\n";
            $text = "";

            $table->item(0)->appendChild($nodeRow);
        }

    }
    /*}}}*/

    /*protected function save(){{{*/
    /*
     * Salva o arquivo .ods
     */
    protected function save()
    {
        copy($this->fileTemplate, $this->fileSave);

        $content = $this->dom->saveXML();

        $zip = new ZipArchive;
        $res = $zip->open($this->fileSave, ZipArchive::CREATE);
        if ($res === TRUE) {
            $zip->addFromString('content.xml', $content);
            $zip->close();
        }

    }
    /*}}}*/
}

$fileTemplate = "/tmp/ods/template.ods";
$fileSave = "/tmp/newODS.ods";

$ods = new ODS($fileTemplate, $fileSave);

$data = array(
        array("Zend Framework 1.0.0 RC 3", "23/06/07", "zip | tar.gz", "Download"),
        array("Zend Framework 1.0.0 RC 2", "07/06/07", "zip | tar.gz", "Download"),
        array("Zend Framework 1.0.0 RC 1", "28/05/07", "zip | tar.gz", "(included in product)"),
        array("Zend Framework 0.9.3 Beta", "04/05/07", "zip | tar.gz", "(included in product)"),
        array("Zend Framework 0.9.2 Beta", "06/04/07", "zip | tar.gz", "(included in product)")
        );

$ods->make($data);
?>
</pre>
<h3>Arquivo para download:</h3>
<p><a id="p15" rel="attachment" href="http://uzed.com.br/wp-content/uploads/2007/07/ods.zip" title="Manipulando ODS com PHP">ods.zip</a></p>
<p>Caso você tenha ou conheça algum componente que faça manipulação de arquivos ODF, colabore comentando e colocando o link do site.</p>
]]></content:encoded>
			<wfw:commentRss>http://uzed.com.br/manipulando-ods-com-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
