Excel m.m. i PHP
I forlængelse af mit forrige indlæg med Zip-filer i PHP kan jeg nævne at de nye Office-produkter faktisk gemmer zip-filer med xml-dokumenter. Prøv fx at omdøbe en .xlsx-fil til .zip og pak den ud.
Jeg vil ikke lige gennemgå hvordan det er bygget op, men jeg har en fil ved navn xl\worksheets\sheet1.xml liggende, og den indeholder bl.a.:
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 | <sheetData> <row r="1" spans="1:2"> <c r="A1"> <v>100</v> </c> <c r="B1"> <v>400</v> </c> </row> <row r="2" spans="1:2"> <c r="A2"> <v>200</v> </c> <c r="B2"> <v>800</v> </c> </row> <row r="3" spans="1:2"> <c r="A3"> <f>SUM(A1:A2)</f> <v>300</v> </c> <c r="B3"> <f>SUM(B1:B2)</f> <v>1200</v> </c> </row> </sheetData> |
Det er en xml-repræsentation af følgende rækker:
1 2 3 | 100 400 200 800 300 1200 |
Hvor den sidste række er en sum af de to ovenstående.
Har man først gennemskuet strukturen er det forholdsvist nemt at lave et PHP-script der kan skrive og læse Excel2007-dokumenter.
Word2007-dokumenter er opbygget på ca. samme måde.
untitled.bmp I Internet Explorer
Jeg har døjet med et irriterende problem …
Jeg genererer nogle grafer ved hjælp af PEAR’s Image_Graph. Jeg ville gerne have at brugernes browsere foreslog et filnavn der gav mening når de valgte at gemme graferne. Endvidere ville jeg gerne have at brugerne kunne printe graferne. Første problem løste jeg ved at sætte følgende header:
Content-Disposition: inline; filename="mingraf.png"Som sidebemærkning kan det nævnes at den version jeg brugte af Image_graph sætter den header selv når man kalder $Graph->done(), men den sætter den forkert. Skal man bruge den header, skal man selv sætte den.
Det fungerer også fint i Firefox, men i Internet Explorer* (må den brænde i helvede!) valgte den altid at gemme billedet som untitled.bmp, og IE kunne heller ikke printe grafen. Ved print opførte den sig som den gør hvis billedet ikke findes.
Så opgaven var 1) filnavn og 2) print
Løsningen blev 1) tillad caching 2) undgå cookies
Dog skal man være opmærksom på, at hvis man kun tillader eller opfordre til caching vil IE gemme grafen som untitled.bmp såfrem man har prøvet at printe eller brugt “Vis udskrift”.
Hvordan man implementerer det er op til en selv, men man skal undgå at sende cookies, samt undgå headere der indikerer at siden ikke må caches. Der blev fra PHP’s side sendt en Cache-Control: no-cache. Den overskrev jeg til sidst i mit script til at sende en Cache-Control: cache.
Sendes der andre caching-begrænsende headere skal disse ligeledes overskrives af headere der tillader eller opfordre til caching. Umiddelbart er jeg kun stødt på Cache-Control, Pragma samt Expires.
Min motivation for at grafen oprindeligt skulle sende en cookie bunder i, at man kun skulle have adgang til den hvis man var logget ind. Derfor inkluderede alle mine script noget koder der kontrollerede brugeren, hvorfor den også satte en cookie hvis man havde adgang.
*) Jeg har kun testet det i Internet Explorer 7.0.5730.13

Jeg hedder Morten, og jeg har udviklet webapplikationer siden slutningen af 90'erne.