Exportare din PHP în Word


Tot la situl la care lucrez am acum (vezi articolul de ieri cu meniul sexy) am nevoie ca utilizatorul webaplicaţiei să poată să îşi ia rapid conţinutul paginii web într-o document Word, unde cu încă două trei mişcări să îl aibă gata pentru salvat, trimis prin email, arhivat, listat… ce vrea el. Desigur, poţi marca cu mouse-ul şi face copy şi apoi paste în Word. Dar webaplicaţia la care lucrez creează fişe şi merită facilitarea salvării în format Word pentru că e esenţială proiectului. Cum facem? Sunt, probabil ştiţi, mai multe metode. Una este să generăm un conţinut HTML şi să îl salvăm într-un fişier Word (adică cu extensia DOC). Deşi ciudat, merge!

O altă soluţie este să apelaţi la o clasă PHP specializată. MS Doc Generator face o treabă bună (pentru descărcare folosiţi eventual SoftPedia). Se poate scrie text formatat, tabele, insera imagini. Am reuşit chiar (cu UTF-8) să scriu şi cu diacritice, fără probleme. O metodă care dă mai puţine dureri este să “fraiereşti” pagina ta HTML şi să pretinzi că e pagină Word. Navigatorul nu o va reda (nu ştie) şi atunci o oferă spre salvare. Să vedem un cod scurt şi la obiect.

[HTML]<?php
if(isset($_GET["exportinword"])){
header("Content-Type: application/vnd.ms-word");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Disposition: attachment;filename=word.doc");
}
?>
<html>
<head><meta http-equiv=’Content-Type’ content=’text/html; charset=iso-8859-2′>
<title>Pagina de test</title></head>
<body>
<h1>Antet</h1><hr size=2 color=#cc0000>
<a href=word.php?exportinword>export</a>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacinia lacinia consequat. Sed dapibus porta massa, sed blandit nisi bibendum eu. Fusce ac diam odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In diam lorem, rutrum sed dignissim vitae, congue non purus. In dignissim leo vitae enim ornare ac dapibus eros molestie. Etiam vel convallis nisl.

<p>Mauris eu metus id velit hendrerit congue euismod sed libero. Nullam blandit mi elit, et convallis augue. In euismod, ligula ac suscipit adipiscing, magna lacus molestie augue, quis facilisis magna velit eu dui. Proin cursus blandit dui id bibendum. Nam dignissim orci non leo mattis nec suscipit magna facilisis. Praesent in dui nisi. Proin aliquam ullamcorper ullamcorper.

<p align=center><img src=http://www.google.ro/intl/ro/images/about_logo.gif>

<p>Nulla aliquam, lorem ut placerat feugiat, metus lorem placerat lacus, sed dignissim sapien odio vel dolor. Nunc malesuada nunc eu mauris eleifend a mollis urna aliquet. Nullam mollis hendrerit nulla, at interdum diam faucibus ut. Cras dolor urna, viverra id bibendum sit amet, adipiscing et odio. Pellentesque venenatis lacinia facilisis. Sed lorem tellus, placerat ut ullamcorper nec, feugiat a lacus. In at molestie mi.

<p>Quisque at erat ipsum, vel suscipit neque. Etiam porta blandit nibh, sit amet imperdiet sem molestie sed. Vivamus varius nibh id velit suscipit convallis. Maecenas ut lorem orci. Quisque in faucibus nisi. Maecenas pharetra diam eu risus auctor facilisis. Nunc sagittis hendrerit leo, non tincidunt mauris vehicula nec. Mauris interdum volutpat nunc, eget commodo risus bibendum non. Proin lobortis urna at orci blandit placerat. Suspendisse potenti.
<hr size=2 color=#cc0000>&copy; 2010
</body>
</html>[/HTML]

Toată şmecheria stă în primele 8 rânduri de cod, în PHP. Pagina de mai sus, pe care am numit-o word.php, este apelată pentru exportare cu un parametru (word.php?exportinword). Când se găseşte acest parametru intră în acţiune liniile 3 până la 6. Navigatorul vă invită să deschideţi un fişier Word. L-am deschis şi am găsit ceea ce aşteptam şi vedeţi şi Dvs în captura de mai jos. Tot ce mai trebuie este un Save As, pas în care alegem formatul MS Word. Daaar… dorim să exportăm doar conţinutul. Să zicem că avem un design complex (de dragul simplităţii nu am făcut aşa ceva în exemplul meu). Cum facem să se exporte în Word doar partea de conţinut, nu şi „ambalajul”, restul sitului?

imagine

Simplu! „Ambalajul” îl vom afişa doar dacă nu este apelată pagina pentru export. Atât. Un truc simplu dar eficient. Să revedem codul de mai sus, puţin modificat. Intenţionat am pus şi un text cu diacritice.

[HTML]<?php
if(isset($_GET["exportinword"])){
header("Content-Type: application/vnd.ms-word");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Disposition: attachment;filename=word.doc");
}
?>
<html>
<head><meta http-equiv=’Content-Type’ content=’text/html; charset=iso-8859-2′>
<title>Pagina de test</title></head>
<body>
<?php if(!isset($_GET["exportinword"])){ ?>
<h1>Antet</h1><hr size=2 color=#cc0000>
<a href=word.php?exportinword>export</a>
<?php } ?>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacinia lacinia consequat. Sed dapibus porta massa, sed blandit nisi bibendum eu. Fusce ac diam odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In diam lorem, rutrum sed dignissim vitae, congue non purus. In dignissim leo vitae enim ornare ac dapibus eros molestie. Etiam vel convallis nisl.

<p>Mauris eu metus id velit hendrerit congue euismod sed libero. Nullam blandit mi elit, et convallis augue. In euismod, ligula ac suscipit adipiscing, magna lacus molestie augue, quis facilisis magna velit eu dui. Proin cursus blandit dui id bibendum. Nam dignissim orci non leo mattis nec suscipit magna facilisis. Praesent in dui nisi. Proin aliquam ullamcorper ullamcorper.

<p align=center><font size=+3>POŞTĂ ŢÂNŢAR</font>

<p align=center><img src=http://www.google.ro/intl/ro/images/about_logo.gif>

<p>Nulla aliquam, lorem ut placerat feugiat, metus lorem placerat lacus, sed dignissim sapien odio vel dolor. Nunc malesuada nunc eu mauris eleifend a mollis urna aliquet. Nullam mollis hendrerit nulla, at interdum diam faucibus ut. Cras dolor urna, viverra id bibendum sit amet, adipiscing et odio. Pellentesque venenatis lacinia facilisis. Sed lorem tellus, placerat ut ullamcorper nec, feugiat a lacus. In at molestie mi.

<p>Quisque at erat ipsum, vel suscipit neque. Etiam porta blandit nibh, sit amet imperdiet sem molestie sed. Vivamus varius nibh id velit suscipit convallis. Maecenas ut lorem orci. Quisque in faucibus nisi. Maecenas pharetra diam eu risus auctor facilisis. Nunc sagittis hendrerit leo, non tincidunt mauris vehicula nec. Mauris interdum volutpat nunc, eget commodo risus bibendum non. Proin lobortis urna at orci blandit placerat. Suspendisse potenti.
<?php if(!isset($_GET["exportinword"])){ ?>
<hr size=2 color=#cc0000>&copy; 2010
<?php } ?>
</body>
</html>[/HTML]

După cum aţi sesizat, ce este înainte şi după partea care ne interesează să fie exportată în Word am blocat să nu se afişeze doar când se face exportare (liniile 13 şi 15, respectiv 29 şi 31). Dacă încărcaţi pagina normal, ea arată… normal. Când dăm click pe export… surpriză… vedeţi în captura de mai jos: vom avea exportat doar ce ne interesează şi cu conservarea diacriticilor.

imagine

PS: de la filename puteţi indica un nume pentru salvare; iar dacă puneţi Content-Type: application/vnd.ms-excel puteţi salva un conţinut în Excel, dar asiguraţi-vă că este un tabel.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (Neevaluat încă)
Loading...Loading...

2 comentarii

  1. Claud spune:

    Desi urasc PHP-ul ca limbaj de programare, se pare ca exista trucuri pentru a face cam orice. Chestia asta e super ca pana la urma poti asigura si un template pentru contracte si nu numai. Sunt curios cum se descurca cu exporturile in Excel (tabele cu borduri, nu doar csv). In .Net pentru templateuri ma folosesc foarte mult de Crystal Report, dar in momentul asta mi-ai dat o idee cum sa ma folosesc de Content type ca sa generez direct continut HTML in Word sau PDF. Tine-o tot asa cu articolele, vizitez siteul zilnic si nu pot sa spun decat ca faci o treaba buna.

  2. Daniel spune:

    Salut. M-am lovit si eu de aceeasi problema si nu am gasit pana in momentul de fata solutia sa introduc imagini embed in fisierul .doc generat. Am folosit functia base64_encode() pentru asta, in browser imaginea apare corect, insa in Word apare iconita X, ca si cand imaginea nu mai exista. Solutii ceva? PS: Good article!!


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *