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:
Caso você tenha ou conheça algum componente que faça manipulação de arquivos ODF, colabore comentando e colocando o link do site.

Obrigada,
Artigo muito bom…
link para o download esta quebrado, teria como vc disponibilizar p/ o meu e-mail, grato.