Czasami tworzenie raportu może okazać się prawdziwym bólem głowy. Na przykład, gdy trzeba zarządzać zawartością raportu w oparciu o warunki w programie. Łatwiej jest to zrobić w kodzie programu, niż przekazywać parametry do raportu i opracowywać logikę skryptu raportu.
Dzisiaj przyjrzymy się jak stworzyć raport z kodu aplikacji, przy czym nie chodzi tu o zwykłą aplikację desktopową, a o aplikację webową ASP.NET Core MVC. Mieliśmy już okazję przyjrzeć się temu, jak stworzyć raport w kodzie aplikacji WinForms. Jednak aplikacje webowe są obecnie o wiele bardziej popularne i wielu użytkowników FastReport chciałoby wykorzystać w nich wszystkie możliwości tego generatora raportów.
Spójrzmy, jak stworzyć szablon raportu i uruchomić go bez użycia projektanta raportów. Po pierwsze, potrzebujemy projektu aplikacji ASP.NET Core MVC. Aby pracować z generatorem raportów FastReport.NET, należy zainstalować jego biblioteki za pomocą menedżera pakietów NuGet.
Ponieważ pakiety biblioteki znajdują się na dysku lokalnym (w katalogu zainstalowanego programu w folderze Nuget), potrzebujemy dodać lokalne źródło pakietów. Aby to zrobić, klikamy na ikonę koła zębatego w prawym górnym rogu menedżera pakietów i dodajemy nowe źródło, które będzie odsyłać do lokalnego folderu z naszymi pakietami (z rozszerzeniem .nupkg):
Teraz możesz wybrać dodane źródło pakietów z listy rozwijanej i zainstalować pakiety.
Aby wykorzystać dodane biblioteki w kodzie programu, należy je najpierw podłączyć w pliku Startup. cs. W metodzie konfiguracyjnej dodajmy ciąg znaków:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { … app.UseFastReport(); … }
Teraz możesz przejść do programowania. Nasz projekt MVC ma:
- Kontrolery, które zawierają logikę działania aplikacji po stronie serwera.
- Widoki wyświetlają informacje dla klienta.
- Modele są odpowiedzialne za pracę z danymi (przyjmowanie, przechowywanie, przekształcanie i zapisywanie).
Nasz prosty przykład będzie wymagał jedynie kontrolera i widoku. Zmieńmy metodę Index w kontrolerze. Nasza aplikacja, która jest automatycznie generowana na podstawie szablonu, posiada już gotowy kontroler - HomeController:
using FastReport.Web; using FastReport; using FastReport.Table; using System.Data; using FastReport.Data; using System.Drawing; using FastReport.Utils; public IActionResult Index() { //Utwórz obiekt raportu sieciowego WebReport report = new WebReport(); // Tworzenie obiektu strony internetowej ReportPage page = new ReportPage(); page.Name = "Page1"; //Dodaj stronę do raportu report.Report.Pages.Add(page); //CUtwórz źródło danych DataSet ds = new DataSet(); ds.ReadXml("C:/Users/FR/source/repos/WebApp/WebApp/Reports/nwind.xml"); //Zarejestruj źródła danych w raporcie report.Report.RegisterData(ds); //Umieść tabelę w raporcie report.Report.GetDataSource("Products").Enabled = true; //Utwórz pasmo danych DataBand dataBand = new DataBand(); dataBand.Name = "DataBand"; //Pobierz tabelę ze źródła danych raportu DataSourceBase data = report.Report.GetDataSource("Products"); //Inicjalizacja źródła danych data.Init(); //I otrzymujemy pierwszy wiersz danych data.First(); //Dodanie paska danych do strony page.Bands.Add(dataBand); //Utwórz obiekt tabeli TableObject table = new TableObject(); table.Name = "Table1"; //Ustaw liczbę wierszy - liczba wierszy w źródle + tytuł table.RowCount = data.RowCount+1; //Ustaw liczbę kolumn table.ColumnCount = 2; //Ustaw wielkość automatyczną pierwszej kolumny, w której będą wyświetlane nazwy produktów table.Columns[0].AutoSize = true; //Ustaw tytuły w pierwszym rzędzie tabeli table[0, 0].Text = "Product Name"; table[0, 0].Border.Lines = BorderLines.All; table[1, 0].Text = "Unit Price"; table[1, 0].Border.Lines = BorderLines.All; int i = 1; //Przeprowadź pętlę przez wszystkie wiersze w źródle danych while(data.HasMoreRows) { //Wyświetlanie nazw produktów table[0, i].Text = data["ProductName"].ToString(); table[0, i].Border.Lines = BorderLines.All; //Ceny wyświetlane table[1, i].Text = data["UnitPrice"].ToString(); table[1, i].Border.Lines = BorderLines.All; //Utwórz obiekt obrazkowy PictureObject picture = new PictureObject(); picture.Bounds = new RectangleF(40, 0, Units.Centimeters * 0.5f, Units.Centimeters * 0.5f); picture.CreateUniqueName(); //Wybieramy obrazek do wyświetlenia w komórce tabeli w zależności od wartości ceny if ((decimal)data["UnitPrice"] < 20) { picture.Image = Image.FromFile("C:/Users/FR/Downloads/28.png"); } else { picture.Image = Image.FromFile("C:/Users/FR/Downloads/29.png"); } picture.LoadImage(); //Załaduj obraz do obiektu picture.Parent = table[1, i]; //Przypisanie obiektu nadrzędnego dla obrazka - komórki tabeli i++; data.Next(); //Pobierz następny rekord z źródła } dataBand.Objects.Add(table); //Dodanie obiektu tabeli do strony raportu ViewBag.WebReport = report; //Przywrócenie raportu do widoku return View(); }
Jak wynika z komentarzy do kodu, obiekty raportów tworzymy ręcznie i budujemy ich hierarchię. Teraz utworzyliśmy raport tabelaryczny z obrazkami w komórkach. Odpowiedni obrazek jest dobierany w zależności od wartości ceny. To jest tylko typowy przykład, kiedy użytkownik mógłby potrzebować stworzyć raport z kodu programu.
Teraz zmieńmy widok Index.cshtml. Zostawmy tylko jedną linijkę:
@await ViewBag.WebReport.Render()
To wszystko. Możesz uruchomić aplikację i zobaczyć nasz raport:
Tak, więc podsumujmy. W gruncie rzeczy tworzenie raportu z kodu aplikacji webowej nie różni się niczym od tworzenia zwykłej aplikacji desktopowej. Z jednej strony wymaga głębokiej wiedzy na temat struktury raportu i jego obiektów, co oznacza, że powinien go tworzyć wykwalifikowany specjalista. Z drugiej strony, czasami jest to jedyny sposób na stworzenie raportu ze skomplikowaną logiką. Więc nie traktuj tej metody jako głównej, niemniej jednak pomoże Ci ona w przypadku zaistnienia takiej potrzeby.