Čas od času jest programátor nucen programovat generování wordových dokumentů nebo statistik a reportů do Excelu.
Generovat v desktopové aplikaci dokumenty Wordu nebo tabulky Excelu je ještě relativně snadné, pokud vyřešíte šarádu s COM knihovnami a zajistíte, že všichni budou mít Office nainstalované, což naštěstí v nejčastější cílové skupině zákazníků ve firmách není až takový problém. Pokud někdo chce generovat Excelový soubor, pravděpodobně bude mít Excel nainstalovaný. Open source bastly firmy moc rády nepoužívají a raději si připlatí za “kvalitu”, i když zrovna u MS Office je ta kvalita na mnoha místech dosti pofidérní.
Ano, pokud používáte pouze základní funkce, je to v pohodě a MS Office fungují skvěle, snadno se používají (pokud si zvyknete na Ribbon, což ale není takový problém, jak se na první pohled zdá; to jen pár skeptiků bude zase v diskusi frflat, že je to strašné - holt nikdy se nedá zavděčit všem). Pokud ale chcete po Wordu nebo Excelu trochu pokročilejší funkce, už je to horší, narazíte na různé překážky a problémy.
Pokud chcete generovat dokumenty nebo tabulky pro Office na webu, je to ještě horší. Instalovat na webový server Office, abyste si mohli zavolat COM, je dosti nezodpovědné (Office není serverová aplikace, někde vám tam při generování dokumentu zůstane viset MessageBox a už ho nikdo neodklikne, navíc to přináší různá bezpečnostní rizika atd.; Office prostě na server nepatří, možná ještě na intranetový, ale i tak).
Řešením, jak generovat DOC nebo XLS na webu, je vytvořit prostě HTML dokument a ten uložit do souboru s příponou doc nebo xls. Pokud generujete nový formát, máte to o trochu jednodušší, je to totiž ZIP plný XML souborů. Stačí tedy ve Wordu dokument připravit a programově ty XMLka jen upravit. U starých formátů většinou musíte generovat od začátku do konce, i když i to se dá.
Office podporují import z HTML pěkně blbě
Cestou vás ovšem potkají různé chuťovky. Já jsem třeba generoval tabulku pro Excel, krásně nastylovanou tak, jak bylo v zadání. V sekci style jsem měl krásnou definici:
th
{
border-top: solid 1pt black;
}
Ať jsem ale dělal, co jsem dělal, na buňky typu th se mi tento styl pořád nechtěl aplikovat. V prohlížeči ano, v Excelu ne. Vztekal jsem se s tím asi hodinu, než mě napadlo zkusit udělat z tohoto stylu třídu head a buňky th změnit na td. Pak už to fungovalo. Excel tedy neumí aplikovat takovýto styl na buňky th. Pokud udělám stejný styl, akorát aplikovaný na td, bude to fungovat. Kdo tohle psal? Proč to pro jeden element funguje a pro jiný ne?
Další problém - mnoho lidí včetně mě je zvyklých na používání více CSS tříd najednou. Mám prostě buňku tabulky a díky šarádě se záhlavím jsem jí chtěl dát class=”head first-column”. No a co se nestane? Pokud dáte do class CSS třídu jen jednu, funguje to správně. Pokud je jich tam víc (což je validní zápis), neaplikuje se pro jistotu třída ani jedna. Zabít. Proč to tam teda implementují, když to neumí naimplementovat kompletně?
Ano, chápu, že je těžké naimplementovat HTML a CSS bez chyb. Nepovedlo se to ještě nikomu a musím říct, že co se týče Internet Exploreru, Microsoft se hodně zlepšil a IE8 implementuje standardy minimálně stejně dobře jako ostatní prohlížeče (mluvím teď o standardech, které jsou již schválené, ne nějaké honby za ACID testy).
Prosím, ať Office neumí půlku CSS vlastností, které nejsou tak moc potřeba, ale ať to proboha respektuje alespoň základní principy aplikování CSS na HTML kompletně!
Kdybych věděl, že s jednou blbou tabulkou bude tolik problém, že mi to zabere půl dne a napíšu kvůli tomu článek na blog, generoval bych to jinak, například přes nové formáty Office Open XML, což je v .NETu sranda, anebo použil nějakou knihovnu, která generuje nativní XLS.