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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | < ?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:
Caso você tenha ou conheça algum componente que faça manipulação de arquivos ODF, colabore comentando e colocando o link do site.
