Manchmal kann die Erstellung eines Berichts echtes Kopfzerbrechen bereiten. Zum Beispiel, wenn Sie den Inhalt eines Berichts je nach den Bedingungen im Programm steuern müssen. Es ist einfacher, dies im Programmcode zu tun, als Parameter an den Bericht zu übergeben und die Logik im Berichtsskript zu organisieren.
Heute werden wir beleuchten, wie man einen Bericht aus dem Code einer Anwendung erstellt, aber nicht einer normalen Desktop-Anwendung, sondern einer Web-Anwendung auf ASP.NET Core MVC. Wir haben bereits beleuchtet, wie man einen Bericht im Code der WinForms-Anwendung erstellt. Aber heutzutage sind Web-Anwendungen viel beliebter und viele FastReport-Benutzer würden gerne alle Funktionen dieses Berichtsgenerators in ihnen nutzen.
Sehen wir uns an, wie Sie eine Berichtsvorlage erstellen und ausführen, ohne den Berichtsdesigner zu verwenden. Zunächst benötigen wir ein ASP.NET Core MVC-Anwendungsprojekt. Um mit dem FastReport.NET-Berichtsgenerator zu arbeiten, müssen Sie seine Bibliotheken mit dem NuGet-Paketmanager installieren.
Da sich die Bibliothekspakete auf dem lokalen Laufwerk befinden (im Verzeichnis des installierten Programms im NuGet-Ordner), müssen wir eine lokale Paketquelle hinzufügen. Klicken Sie dazu auf das Zahnradsymbol in der oberen rechten Ecke des Paketmanagers und fügen Sie eine neue Quelle hinzu, die auf den lokalen Ordner verweist, der Ihre Pakete enthält (mit der Erweiterung .nupkg):
Sie können nun die hinzugefügte Paketquelle aus der Dropdown-Liste auswählen und die Pakete installieren.
Um die hinzugefügten Bibliotheken im Programmcode zu verwenden, müssen Sie sie zunächst in der Datei Startup.cs aktivieren. Fügen Sie der Konfigurationsmethode eine Zeile hinzu:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { … app.UseFastReport(); … }
Jetzt können Sie direkt zur Programmierung übergehen. Unser MVC-Projekt hat:
In unserem einfachen Beispiel benötigen wir nur einen Controller und eine Ansicht. Ändern wir die Index-Methode im Controller. In unserer Anwendung, die automatisch aus einer Vorlage generiert wird, haben wir bereits einen vorgefertigten Controller, HomeController:
using FastReport.Web; using FastReport; using FastReport.Table; using System.Data; using FastReport.Data; using System.Drawing; using FastReport.Utils; public IActionResult Index() { //Erstellen eines Web-Berichtobjekts WebReport report = new WebReport(); //Erstellen eines Webseitenobjekts ReportPage page = new ReportPage(); page.Name = "Page1"; //Hinzufügen einer Seite zum Bericht report.Report.Pages.Add(page); //Erstellen einer Datenquelle DataSet ds = new DataSet(); ds.ReadXml("C:/Users/FR/source/repos/WebApp/WebApp/Reports/nwind.xml"); //Registrieren der Datenquelle im Bericht report.Report.RegisterData(ds); //Einfügen einer Tabelle in den Bericht report.Report.GetDataSource("Products").Enabled = true; //Erstellen des Datenbands DataBand dataBand = new DataBand(); dataBand.Name = "DataBand"; //Erzeugung der Tabelle aus der Berichtsdatenquelle DataSourceBase data = report.Report.GetDataSource("Products"); //Initialisieren der Datenquelle data.Init(); //Erzeugung der ersten Datenzeile data.First(); //Hinzufügen eines Datenbandes zur Seite page.Bands.Add(dataBand); //Erstellen eines Tabellenobjektes TableObject table = new TableObject(); table.Name = "Table1"; //Festlegen der Zeilenanzahl - Zeilenanzahl in der Quelle + Kopfzeile table.RowCount = data.RowCount+1; //Festlegen der Spaltenanzahl table.ColumnCount = 2; //Einstellen des automatischen Anpassens der Breite der ersten Spalte, in der die Produktnamen angezeigt werden table.Columns[0].AutoSize = true; //Festlegen von Kopfzeilen in der ersten Tabellenzeile 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; //Durchlaufen durch alle Zeilen der Datenquelle while(data.HasMoreRows) { //Anzeige von Produktnamen table[0, i].Text = data["ProductName"].ToString(); table[0, i].Border.Lines = BorderLines.All; //Anzeige von Preisen table[1, i].Text = data["UnitPrice"].ToString(); table[1, i].Border.Lines = BorderLines.All; //Erstellen des Bildobjekts PictureObject picture = new PictureObject(); picture.Bounds = new RectangleF(40, 0, Units.Centimeters * 0.5f, Units.Centimeters * 0.5f); picture.CreateUniqueName(); //Je nach dem Preis wählen wir aus, welches Bild in der Tabellenzelle angezeigt werden soll 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(); //Laden des Bildes in das Objekt picture.Parent = table[1, i]; //Zuweisen des übergeordneten Objekts für das Bild - die Tabellenzelle i++; data.Next(); //Der nächste Datensatz aus der Quelle } dataBand.Objects.Add(table); //Hinzufügen eines Tabellenobjekts zur Berichtsseite ViewBag.WebReport = report; //Übertragen des Berichts in die Ansicht return View(); }
Aus den Kommentaren zum Code geht hervor, dass wir die Berichtsobjekte manuell erstellen und ihre Hierarchie aufbauen. Wir haben nun einen tabellarischen Bericht mit Bildern in den Zellen erstellt. Je nach dem Preis wird das gewünschte Bild ausgewählt. Dies ist ein typisches Beispiel, wenn Sie eventuell einen Bericht aus dem Programmcode erstellen müssen.
Ändern wir nun die Ansicht der Index.cshtml. Lassen wir nur eine Zeile übrig:
@await ViewBag.WebReport.Render()
Das wäre alles. Sie können die Anwendung ausführen und unseren Bericht einsehen:
Als Fazit lässt sich festhalten, dass sich das Erstellen eines Berichts aus dem Code einer Web-Anwendung von einer normalen Desktop-Anwendung tatsächlich nicht unterscheidet. Einerseits erfordert die Erstellung eines Berichts aus dem Code ziemlich fundierte Kenntnisse über die Struktur des Berichtes und seine Objekte, was bedeutet, dass ein qualifizierter Fachmann den Bericht erstellen muss. Andererseits ist es manchmal die einzige Möglichkeit, einen Bericht mit komplexer Logik zu erstellen. Daher sollten Sie diese Methode der Berichtserstellung nicht als Basis betrachten. Aber sie wird Ihnen in Notsituationen helfen.