Archive for » July, 2007 «

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

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:

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
Friday, July 06th, 2007 | Author: admin

Objetivo

Adicionar arquivo no ZIP, fazer o download e apagar o arquivo ZIP.

Problema

Vários usuários estarão fazendo download, e cada um com a sua seleção de arquivos , ou seja o arquivo ZIP sempre será diferente para cada usuário.

Solução

- Usar como nome de arquivo o id da sessão do usuário.
- Criar um arquivo ZIP usando o parametro ZIPARCHIVE::OVERWRITE para criar um arquivo.
- Adicionar os arquivos desejados.
- Modificar o header para binario e colocar o nome do arquivo para download.
- Não esquecer de apagar o arquivo depois de feito o download.

Segue o código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<php?
 
$zip = new ZipArchive;
$file = session_id();
$res = $zip->open("/tmp/{$file}", ZIPARCHIVE::OVERWRITE);
$zip->addFile('/tmp/teste.txt', 'teste.txt');
$zip->close();
 
 
$fp = fopen("/tmp/{$file}", 'rb');
 
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="arquivo.zip"');
header('Content-Length: ' . @filesize("/tmp/".$file));
fpassthru($fp);
 
unlink("/tmp/{$file}");
 
?>
Category: PHP  | 4 Comments
Thursday, July 05th, 2007 | Author: admin

Segue o link da materia http://eustaquiorangel.com/blog/show/293

Category: Informática  | Tags:  | Leave a Comment