Newsgroup: it.comp.www.php
Titolo: Generare dinamicamente un documento Word

Ho un applicativo PHP+MySQL che gestisce dati (non importa di che
tipo).
Avrei la necessità di generare dinamicamente dei documenti Word con i
dati prelevati dal DB. In pratica ho un template in Word con dei campi
che vorrei popolare in tempo reale sulla base della query effettuata
dall'utente. Lo scopo è produrre dei printout ben impaginati
(immaginate ad esempio la stesura di una fattura commerciale, pre-
impaginata in Word e compilata dinamicamente dall'applicativo).
Mi date suggerimenti su dove iniziare a guardare/studiare/smanettare
per risolvere questo problema? Come faccio a passare variabili dal PHP
al file Word?
Purtroppo l'uso di Word è una conditio sine qua non imposta dal
cliente...
Grazie per l'aiuto!!! :-)

cliente...
"Uso di Word" è una formulazione vaga.
Nella mia umile esperienza, la richiesta che hai ricevuto si traduce dall'
utentese (una lingua complessa che richiede anni di studi) in italiano con
"Io 'un ci capisco niente, conosco Word, voglio roba che s'apra in Word".
(E' possibile che invece lo chiedano per usare VBA o simili, ma e' raro).
Quindi questo, se lo salvi con estensione .DOC, "si apre con Word".
Ha perfino le font, anche se referenzia la Segoe UI di sistema ed e' molto
snellito. Due giri di sed, o preg_replace, e sei lesto.
Per creare un file così, prendi un file .DOC, lo salvi come ".RTF" e vai a
guardarci dentro. Se ci scrivi dei segnaposto in Word, per esempio
__INDIRIZZOCLIENTE__ __NOME__ __CIPPALIPPA__
troverai quei testi come testo semplice nel file RTF. E li potrai cambiare
al volo con preg_replace (o anche str_replace, che qui è meglio).
Unica cosa, devi usare le tabelle per posizionare bene il testo. Oppure ti
tocca sostituire interi paragrafi. Ma anche questo lo puoi fare, neh?
Poi mandi il file con MIME-type di MS Word, estensione .DOC... ed ecco che
"il file si apre con Word".
Puoi dire, e non sarebbe neanche una bugia!, che "esistono troppe versioni
di Word, così noi adottiamo un formato che è leggibile da tutte, mentre se
usassimo i formati più recenti, DOCX, ecc., si potrebbero leggere solo con
versioni di Office recenti".
Comunque, la soluzione che ti serve IMHO e' PDF, con le classi fpdf di PHP
e via andare.
Leonardo "un altro mistico trucco dell'apotropaico Mago Afono"
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1040\deflangfe1040
{\fonttbl
{\f35\fswiss\fcharset0\fprq2{\*\panose 020b0502040204020203}Segoe UI;}
}
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green1
28\blue128;\red192\green192\blue192;}
{\stylesheet
{\qj
\li0\ri0\sb60\sa60\sl-280\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
\f1\fs20\lang1033\langfe1033\kerning24\cgrid\langnp1033\langfenp1033
\snext0 Normal}
}
{\*\generator Microsoft Uord 10.0.666;}
{\info
{\title Hello, world}
{\author Leonardo Serni}
{\operator Leonardo Serni}
{\creatim\yr2011\mo4\dy22\hr12\min8}
{\revtim\yr2011\mo4\dy22\hr12\min9}
{\version1}
{\edmins1}
{\nofpages1}
{\nofwords2}
{\nofchars12}
{\*\company CELT }
{\nofcharsws13}
{\vern16393}
{\*\password 00000000}
}
\paperw11906\paperh16838\margl1134\margr1134\margt1417\margb1134\gutter0
\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz283\grfdocevents0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1134
\dgvorigin1417\dghshow1\dgvshow1\jexpand\viewkind1\viewscale110\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
{\i\fs40\lang1040\langfe1033\langnp1040 Hello, world.}
}
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

 con php non so
Con PHP puoi usare OLE, ma devi avere un server Windows con installato 
Office, per quanto ne so.
Oppure generare un odt e poi convertirlo con unoconv in .doc
La soluzione di Leonardo rimane la migliore, IMHO.
Bye.

 La soluzione di Leonardo rimane la migliore, IMHO.
http://www.phpdocx.com
questa dovrebbe essere la "soluzione Leonardo"


Io, fra l'altro, ho fatto una cosa simile con DOM per creare un XML
apribile con Excel 2007


http://www.phpdocx.com

Tranne per il fatto che DOCX è il formato messo su da MS dopo essere
zompata sul vagone XML (doveva essere - si mormora - un OpenDocument
Killer, avere XPS nel taschino e non so cos'altro [1]).
Quindi sì, ha parecchi vantaggi rispetto a DOC e RTF, però ha questo
svantaggio: richiede un lettore "moderno". Se uno ha Word 97... cosa
che succede, e come se succede... ti dirà "non mi si apre", anzi, ti
dirà "Non è un documento Word perché io ho Word e non lo apre".
Leonardo ( :-( )
[1] potenzialmente tutto vero, anche. Embrace-and-Extend non e' ipso
    facto il Male. E' quando ci mettono anche il marketing di mezzo,
    e in MS succede sempre, che finisce tutto a donnine allegre.
