Dirbdamas su Visual Studio pastebėjau, kad šis įrankis turi… Norėjau pasakyti neturi daug naudingų pagalbinių priemonių, kokių tikėtumėmės iš analogiškų sistemų. Šį kartą man reikėjo, jog programa darytų ataskaitas, tačiau jokio tam skirto komponeto neradau. Vienas iš variantų - Crystal Report, bėda ta, jog jis nėra standartinis priedas ir ne gana to dar truputį kainuoja. Todėl norėčiau pakalbėti apie antrą būdą, kuris mane pilnai patenkino.
Kad nereiktų išgalvoti kokios nors sudėtingos programos pasinaudosiu anksčiau savo sukurta programa apie kurią jau rašiau straipsnyje “Darbas su XML failais”. Tiems, kurie neskaitė ansktesnio mano straipsnio, tikiuosi nekils keblumų.
Pati metodo idėja: XML failą galima pasidaryti kokį norime ir vėliau atvaizduoti naršyklėje. Tam reikės susipažinti su XSL stiliaus failais. Aš pirmą kartą pažvelgęs į šio failo kodą supratau kas, kaip ir kur. Tikiuosi jums irgi seksis taip pat gerai.
Pirmiausia prisiminkim kaip atrodo mūsų XML failas:
<books> <book> <title>Davinci code</title> <price>19.95</price> </book> <book> <title>Hackers guide</title> <price>49.99</price> </book> </books>
Kaip matote turinys labai kuklus: viso labo turime tik knygos pavadinimą ir kainą.
XML stilių failas labiau panašesnis į HTML nei į CSS failą, jo turinys bus toks:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Ataskaita</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Pavadinimas</th>
<th align="left">Kaina</th>
</tr>
<xsl:for-each select="books/book">
<tr>
<th ><xsl:value-of select="title"/></th>
<th ><xsl:value-of select="price"/></th>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>Į ką reikia atkreipti dėmesį? Iš pradžių mes apsirašome visokius stiliaus elementus, kurie visiškai nesvarbūs. Tuomet < xsl:for-each select=”books/book”> eilutė nurodo, jog iš viso sąrašo išrinkti elementus, su kuriais bus atliekami veiksmai, tai tarsi ciklo atidarymas. books pagrindinis viso XML failo elementas, o book - smulkesnis, su kuriuo ir bus atliekami kartojami veiksmai. Toliau parodome, kokius elementus paimti < xsl:value-of select=”title”/>. Aš nurodžiau paimti abu, tačiau, jeigu nenorite, nenurodykite, tuomet ataskaitoje tas elementas nefigūruos.
Rodos, šioje dalyje viskas, dabar laikas pasikurti Visual Studio ir parašyti šiek tiek kodo. Pirmiausiai įsidedu button, kuriame rašysiu kodą, tačiau dar prieš rašant, reikia įsidėti keletą papildomų bibliotekų: System.Xml, System.Xml.XPath, System.Xml.Xsl, tikiuosi šitas dvi įsidėsite be vargo patys, tačiau be jų mums dar reikės Microsoft HTML Object Library (mshtml) ir Microsoft Internet Controls, kas beje reiškia, jog nepriklausomai nuo to, kokia pas jus naršyklė yra standartinė, vis tiek ataskaitos bus atidaromos būtent IE (kaip beje elgiasi ir ICQ6). Komponentų pridėjimui paspauskite dešinį ant projekto pavadinimo ir pasirinkite Add Reference ->COM ir ten susiraskite reikiamas bibliotekas.
Tikiuosi jau susitvarkėte su bibliotekomis? Tuomet parašykime šiek tiek kodo
string xml="BOOKS3.XML"; string xsl = "BOOKS.XSL"; XmlTextReader xmlStringReader = new XmlTextReader(xml); XPathDocument xPathDocument = new XPathDocument(xmlStringReader); XmlTextReader xslTextReader = new XmlTextReader(xsl); XslTransform xslTransform = new XslTransform(); xslTransform.Load(xslTextReader, null, GetType().Assembly.Evidence); StringWriter htmlStringWriter = new StringWriter(); xslTransform.Transform(xPathDocument, null, htmlStringWriter, null); string html = htmlStringWriter.ToString(); xmlStringReader.Close(); xslTextReader.Close(); htmlStringWriter.Close();
Kai rašiau ankstesnę programą šiek tiek žaidžiau su openFileDialog ir saveFileDialog , šį kartą darau statiškai, pasitobulinsite patys.
Taigi, pirmose dvejuose eilutėse apsirašau failus, su kuriais dirbsiu. XmlTextReader nuskaito XML failą, o XPathDocument paverčia jį į XPath duomenų modelį. Tuomet nuskaitomas XSL failas ir sukuriama XslTransform transformacija, kuri susieja XML ir XSL failą bei paverčia juos į HTML. Šitoje dalyje viskas.
SHDocVw.InternetExplorer internetExplorer = new SHDocVw.InternetExplorerClass(); SHDocVw.IWebBrowser2 webBrowser = (SHDocVw.IWebBrowser2)internetExplorer; webBrowser.Visible = true; object noValue = System.Reflection.Missing.Value; webBrowser.Navigate("about:blank", ref noValue, ref noValue, ref noValue, ref noValue); mshtml.IHTMLDocument2 htmlDoc = internetExplorer.Document as mshtml.IHTMLDocument2; htmlDoc.writeln(html); htmlDoc.close();
Pažiūrėję į šį kodą tikriausiai supratote, kam reikėjo tų dviejų papildomų komponentų, nes būtent dabar jų pagalba yra sukuriamas IE objektas. Iš pradžių užkraunamas tuščias puslapis ir tik tada jame pateikiama ataskaita.
![]()
Kaip matote vaizdelis nėra stebuklingas, bet jeigu pasitreniruotumėte galėtumėte padaryti ir geriau.
Tai labai paprastas būdas daryti ataskaitas, tačiau galbūt jis ne visus ir ne visuomet tenkins, jeigu kas turite kitų idėjų, kaip galima būtų generuoti ataskaitas su Visual Studio nesikuklinkit, pasidalinkit.
Nuorodos:
XSL pagrindai
XQuery 1.0 and XPath 2.0 Data Model (XDM)
2007-06-11 | 11:39
Sveiks,
jei reikia generuoti web ataskaitas is .NET aplikaciju naudok SQL Server Reporting Services kuris ateina su nemokama SQL serverio versija (Express Edition). Duomenis ataskaitom galima imti netik is SQL bet ir is kitu duomenu saltiniu. Cia daugiau informacijos: _http://msdn2.microsoft.com/en-us/sql/aa336316.aspx
Be to Crystal Report komponentai kurie ateina su Visual Studio yra “nemokami” t.y. nereikia moketi papildomai. Juos gali pilnai naudoti savo programoje ir sukurti normalia ataskaita. Papildomas Crystal licencijas ir produktus tau reiketu pirkti jei nori kad ataiskaitas kurtu pazangus vartotojai ir tureti daugiau funkcionalumo.
Sekmes!