Tag-Archive for » ODS «

Tuesday, July 10th, 2007 | Author: zedmaster

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 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.
Aqui o que nos interessa é o arquivo content.xml, o qual iremos manipular o seu conteúdo usando DOM (nativo no PHP5 ou DOM XML no PHP4).

Felizmente para usuários MS OFFICE existe agora um plug-in desenvolvido pela SUN que conseque importar e exportar arquivos ODF (no nosso caso iremos usar apenas o ODS). Eu particularmente uso o OpenOffice que me demonstrou obter todos os resultados que eu precisei ate hoje.
Mas para quem usa somente o MS Office segue o link para download:
http://www.sun.com/software/star/openoffice/

Objetivo

Abrir um arquivo .ods usado como template, copia-lo em uma outra pasta, inserir uma sequência de dados e fecha-lo.

Problema

Não salvar o conteúdo no arquivo de template, e sim usar uma copia dele.

Solução

- Fazer uma cópia do arquivo na pasta destino.
- Abrir o arquivo XML dentro do arquivo .ods.
- Manipular os dados usando DOM.
- Salvar o arquivo no .ods.

Código

< ?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);
?>

Arquivo para download:

ods.zip

Caso você tenha ou conheça algum componente que faça manipulação de arquivos ODF, colabore comentando e colocando o link do site.

Category: PHP  | Tags: , ,  | 2 Comments