Generování DOC a XLS souborů na webu

Tomáš Herceg       26. 6. 2009       Offtopic, Office       7577 zobrazení

Č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.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: Generování XLS souborů na webu

"Ř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"

Chápu to správně tak, že vytvořit obyčejné HTML a to přejmenovat na doc, případně xls? V tom případě by to byla mimořádně velká prasárna.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano, ale na jednodušší věci je to obecně doporučovaný způsob a já konkrétně jsem neměl jinou možnost, takhle znělo zadání. Kupovat kvůli jednoduchoučké tabulce s primitivním formátováním nějaké knihovny by bylo dost nevýhodné.

Ono by na tomto způsobu nebylo principiálně nic až tak špatného, jakmile si to Excel či Word jednou otevře, převede to do svého binárního formátu a je to. Ale bohužel problém je v tom, že is to HTML a CSS interpretují po svém a není to pořádně nikde popsáno (MS sice v roce 2000 k tomuto vydal dokumentaci, která tohle dost detailně popisuje, ovšem v článku uvedené nuance tam nějak nejsou zmíněny, anebo jsem je tam nenašel, ale četl jsem to dost podrobně).

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ale jak jste vyřešil kódování znaků v češtině právě pro aplikaci MS Esxcel???

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback