Dynamischer Tabellendatenbericht in ASP.Net

8

Ich arbeite an einer MVC5-Webanwendung, bei der ich einen Bericht aus einer beliebigen Datenbanktabelle generieren muss. Der Benutzer wählt die Tabelle aus, die er drucken möchte, und wählt dann aus, welche Spalten in den Bericht aufgenommen werden sollen, und das System sollte einfach ein Raster (Tabelle) mit den Daten anzeigen.

Das Anzeigen der Daten in einer HTML-Tabelle ist natürlich kein Problem und ich habe es auch geschafft, Excel-Dateien mit den Daten zu generieren, die der Benutzer herunterladen kann.

Ich muss jedoch auch eine druckbare Form des Berichts bereitstellen, z. B. PDF oder ein anderes Format, das keine spezielle Software (z. B. MS Office) zum Öffnen und Drucken benötigt.

Zuerst dachte ich, ich sollte das ReportViewer-Steuerelement verwenden, aber das Problem ist, dass mein Bericht dynamisch ist, da der Benutzer die Spalten auswählt, die er benötigt. Ich habe Versuche von anderen gesehen, die Berichtsdefinitionsdatei zu erstellen, aber ich habe auf etwas weniger Hässliches gehofft.

Gibt es eine Möglichkeit, eine HTML-Tabelle zu erstellen, die die Größe der Zellen gut berechnet und daraus eine PDF-Datei erstellt? Es macht mir nichts aus, den Bericht auf mehreren Seiten horizontal zu teilen, wenn die Spalten zu viele sind.

    
kagelos 19.02.2016, 11:02
quelle

2 Antworten

2

Du könntest Spartacus ausprobieren.

Es ist eine relativ neue .NET-Bibliothek, vollständig in C # geschrieben. Es kann eine Verbindung zu vielen verschiedenen Datenbanken herstellen und Berichte in Excel und PDF generieren.

Ich habe 3 Dateien in Google Drive hochgeladen:

Um Spartacus zu verwenden, müssen Sie auf System.Data und System.Xml-Pakete sowie auf Spartacus.dll verweisen.

Im folgenden Beispiel habe ich report.pdf aus template.xml in einfachen Schritten erstellt:

%Vor%

Beachten Sie, dass Sie Spartacus.Database-Objekte nicht benötigen. Wenn Sie eine System.Data.DataTable auf andere Weise abrufen können, können Sie sie an das Report-Objekt übergeben.

Allerdings gibt es einen Haken. Wie Sie in der XML-Vorlage sehen können, müssen Sie für jede Spalte wissen:

  • Spaltenname (offensichtlich)
  • Titel
  • Ausrichtung (LINKS, RECHTS oder MITTE)
  • Füllen Sie (Prozent, 100 ist die Gesamtbreite der Seite abzüglich der Breite der Ränder)
  • Geben Sie ein (INTEGER, REAL, BOOLEAN, CHAR, DATE oder STRING)

Füllung und Typ sind wichtig, und Sie müssen möglicherweise Informationen über alle Ihre Spalten aufbewahren. Wenn dies zu schwer zu erreichen ist und Sie nur den Namen und den Typ der Spalte abrufen können, können Sie eine Berechnung nur basierend auf dem Typ berechnen, beispielsweise:

  • Produkt hat den Typ STRING, Standardfüllung = 30
  • Beschreibung hat den Typ STRING, Standardfüllung = 30
  • Einheit hat den Typ STRING, Standardfüllung = 30
  • menge ist vom Typ REAL, Standardfüllung = 15
  • total_cost ist vom Typ REAL, Standardfüllung = 15
  • unit_cost ist vom Typ REAL, Standardfüllung = 15

Die Summe aller Standardfüllungen ist 30 + 30 + 30 + 15 + 15 + 15 = 135, größer als 100. Sie können also auf 100 normalisieren:

  • Spaltenfüllung = Spaltenstandardfüllung * (Summe der Standardfüllungen / 100)

Danach müssen Sie dynamische template.xml-Dateien mit dynamischen Feldinformationen generieren.

DISCLAIMER : Ich bin der Schöpfer und Betreuer von Spartacus.

    
wind39 29.02.2016, 20:24
quelle
0

SSRS bietet eine große Unterstützung für die automatische Verarbeitung der Seitennummerierung, die Einhaltung der Regeln ist jedoch entscheidend.

Erläuterung der Seitenumbruch in Reporting Services (Berichts-Generator 3.0 und SSRS)

  

Wenn Sie einen Bericht so entworfen haben, dass er eine Seite umfasst, aber auf mehreren Seiten gerendert wird, überprüfen Sie, dass die Breite des Berichtshauptteils einschließlich der Ränder nicht größer ist als die Breite der physischen Seitengröße. Um zu verhindern, dass Ihrem Bericht leere Seiten hinzugefügt werden, können Sie die Containergröße reduzieren, indem Sie die Container-Ecke nach links ziehen.

    
Jeremy Thompson 24.02.2016 06:01
quelle