Biblioteka JasperReports

Ostatnio zajęty byłem tworzeniem pewnej aplikacji dla firmy. Jak to w takich projektach bywa – czasem trzeba coś wydrukować. Powiem więcej – wydrukować nie byle co, a konkretnie sformatowany dokument.

Początki

Początkowo poszedłem w kierunku przetworzenia kodu HTML podmieniając zmienne odpowiednimi wartościami wrzucić na jakiś komponent renderujący HTML w Javie i drukując jego zawartość. Pomysł był genialny dopóki nie odkryłem jak bardzo ograniczona jest obsługa HTML w Javie… Wówczas próbowałem szukać jakichś interesujących bibliotek służących do wyświetlania odpowiedniego kodu HTML+CSS. Na tym polu (w kwestii darmowych rozwiązań) Java zwyczajnie leży! Jest kilka komponentów, które nawet obsługują CSS, ale niestety w jakichś starych wersjach.

Westchnąłem wówczas krótko, podwinąłem rękawy w T-shircie i zabrałem się do rysowania dokumentu z poziomu kodu Javy. Po kilku godzinach miałem w miarę działający kod, który tworzył dokument w odpowiednim formacie. Jedyny problem leżał w obsłudze tabel z danymi… Jeśli dane w komórce tabeli były za długie to zwyczajnie wystawały na następną komórkę. No i dodatkowo drukowanie… Trzeba było wziąć pod uwagę, że dokument może zostać podzielony na kilka stron w przypadku długich tabel. Naprawianie tych problemów prawdopodobnie trwałoby do dzisiaj, a i tak nie byłbym zadowolony.

Ratunek

Postanowiłem zatem poszukać lepszego rozwiązania i natrafiłem na bibliotekę JasperReports. Sama biblioteka służy do renderowania różnego rodzaju dokumentów na podstawie szablonu zapisanego w pliku XML oraz danych zapisanych w bazie danych lub ręcznie zdefiniowanym źródle danych (rozszerzenie klasy DataSource). W skład biblioteki wchodzi również panel do wyświetlania podglądu dokumentu w sposób podobny do znanego z Adobe Readera.

Dokumenty utworzone przy użyciu tego narzędzia potrafią być bardzo skomplikowane, a co za tym idzie ich szablon tworzony w XML jest niemalże niemożliwy do zarządzania. Na szczęście twórcy biblioteki pomyśleli o tym i dali nam wspaniałe narzędzie iReport. Służy ono do graficznego rozmieszczania elementów na dokumencie oraz kilku dodatkowych ustawień, o których za chwilkę. iReport dostępny jest jako osobny program lub jako wtyczka do Netbeansa. Bardzo przydatna rzecz, ponieważ mając plik szablonu w projekcie możemy go po prostu otworzyć i załaduje się iReport wewnątrz okna Netbeansa.

Zalety

Początkowo nie zdawałem sobie sprawy z potęgi tej biblioteki. Zależało mi głównie na narysowaniu, podglądzie i wydrukowaniu. Jednak po dłuższych oględzinach biblioteki okazało się, że w dokumentach można zdefiniować zmienne, które potrafią bardzo pomóc np. automatycznie numerując wprowadzane do tabeli dane. Drugą potężną opcją jest możliwość wykorzystania kodu Javy w pewnych elementach (także do modyfikacji zmiennych) dzięki czemu mogłem na przykład wyświetlać datę w odpowiednim formacie. Wystarczyło po prostu stworzyć zmienną typu SimpleDateFormat(„dd-MM-yyyy”) i można było używać jej w całym dokumencie. Dzięki temu jeśli uznam, że wolę datę z kropkami czy w ogóle w jakimś innym formacie – wystarczy zmienić to w jednym miejscu. Podobnie z datą wystawienia dokumentu – jeśli może być automatyczna to wystarczy w pole gdzie ma być wyświetlona wrzucić obiektnew Date(). Oczywiście warto go również sformatować odpowiednio 😉

W ten sposób jeśli dobrze posługujemy się całym tym mechanizmem to możemy zrzucić połowę pracy na JasperReports tworząc szablon dokumentu w odpowiedni sposób. Pięknie, nieprawdaż?

Właściwości

Oprócz zmiennych mamy do dyspozycji jeszcze właściwości dokumentu. Służą one do przekazywania pewnych wartości, które nie mogą zostać pobrane ze źródła danych bo ich tam po prostu nie ma 🙂 Przykładowo jeśli drukujemy fakturę i dane o towarach pobieramy ze źródła danych to są to jedynie dane o towarach – nie ma informacji na temat terminu płatności faktury czy nazwy kontrahenta. Dzięki właściwościom jesteśmy w stanie przekazać do dokumentu dodatkowe informacje. Najciekawszy w tym systemie jest fakt, że właściwości mogą być dowolnego typu – może to być nawet typ zdefiniowany przez nas w programie. W ten sposób jeśli mamy klasę Faktura i chcemy wydrukować fakturę z danymi z tego obiektu, wystarczy podać go jako parametr i w dokumencie możemy posługiwać się nim w normalny sposób wywołując wszelkie potrzebne metody.

Na koniec

Prawdopodobnie pobawię się jeszcze z tą biblioteką gdyż mam kilka pomysłów na jeszcze większe usprawnienie pracy i zwalenie większej ilości roboty na dokument 🙂 Możliwości jakie oferuje ta biblioteka są ogromne i zachęcam wszystkich do wypróbowania jej. Pewnie coś jeszcze o niej napiszę.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s