Report Viewer

TsgcHTMLComponent_ReportViewer affiche un rapport dans une page web, avec un panneau de paramètres, un aperçu PDF, Télécharger le PDF, Imprimer et Exporter vers Excel. Le rapport est un TsgcHTMLReport, un moteur de rapports par bandes qui imprime groupes, totaux, graphiques, codes-barres et sous-rapports en PDF avec le moteur PDF de sgcHTML, sans outil de reporting externe, pilote d'imprimante ni DLL, en Delphi, C++ Builder et .NET.

TsgcHTMLComponent_ReportViewer et TsgcHTMLReport

Définissez le rapport avec ses bandes et ses Parameters, liez-le au visualiseur et rendez-le. Le visualiseur construit un formulaire à partir des paramètres, et l'aperçu, le téléchargement et l'impression sont le même PDF, généré sur le serveur avec les valeurs appliquées par l'utilisateur, de sorte que ce que l'utilisateur voit est ce qu'il imprime. Rien n'est conservé sur le serveur entre les requêtes.

Classes du composant

TsgcHTMLComponent_ReportViewer, le visualiseur, et TsgcHTMLReport, le moteur de rapports non visuel qu'il affiche

Rendu

Un panneau de paramètres, un aperçu dessiné avec le pdf.js intégré du visualiseur PDF, et les liens Télécharger le PDF, Imprimer et Exporter vers Excel

Langages

Delphi, C++ Builder, .NET

Un rapport de ventes avec paramètres, dans le navigateur

Le rapport déclare une période obligatoire et une région. Le visualiseur les transforme en champs, et le rapport filtre ses données dans son propre événement OnBeforeGenerate avec les valeurs que l'utilisateur applique.

uses
  sgcHTML_Export_PDF, sgcHTML_Report, sgcHTML_Component_ReportViewer;

// the report
oReport := TsgcHTMLReport.Create(Self);
oReport.Title := 'Sales';
oReport.FileName := 'sales';
oReport.DataSet := qrySales;
oParam := oReport.Parameters.Add;
oParam.Name := 'Period';
oParam.Caption := 'Period';
oParam.Kind := rpkDateRange;
oParam.DefaultValue := '2026-01-01;2026-12-31';
oParam.Required := True;
oParam := oReport.Parameters.Add;
oParam.Name := 'Region';
oParam.Caption := 'Region';
oParam.Kind := rpkSelect;
oParam.Options.Add('EU=Europe');
oParam.Options.Add('US=United States');
oReport.OnBeforeGenerate := ReportBeforeGenerate;

// a detail band: one line per row
oBand := oReport.Bands.Add;
oBand.Kind := rbkDetail;
oItem := oBand.Items.Add;
oItem.Text := '[Product]';
oItem.Width := 100;
oItem := oBand.Items.Add;
oItem.Text := '[Amount:#,##0.00]';
oItem.Left := 100;
oItem.Width := 80;
oItem.Align := paRight;

// the viewer
oViewer := TsgcHTMLComponent_ReportViewer.Create(Self);
oViewer.Name := 'SalesViewer';
oViewer.HTMXEngine := sgcHTMXEngine1;
oViewer.Report := oReport;
oViewer.TokenSecret := LoadSecretFromConfig;
oTemplate.BodyContent := oViewer.HTML;

// the report filters its data with the values of the viewer
procedure TForm1.ReportBeforeGenerate(Sender: TObject; aParams: TStrings);
var
  vPeriod: string;
begin
  vPeriod := aParams.Values['Period'];   // from;to
  qrySales.Close;
  qrySales.ParamByName('FromDate').AsString := Copy(vPeriod, 1, Pos(';', vPeriod) - 1);
  qrySales.ParamByName('ToDate').AsString := Copy(vPeriod, Pos(';', vPeriod) + 1, 10);
  qrySales.ParamByName('Region').AsString := aParams.Values['Region'];
  qrySales.Open;
end;
@* Views/Reports/Sales.cshtml: SalesReport is a long-lived TsgcHTMLReport *@
@model ReportsModel

<sgc-report-viewer name="sales" report="@Model.SalesReport"
                   show-export-xlsx="true" zoom="page-width"
                   css-height="720px" token-lifetime="300"
                   on-before-generate="Model.CheckAccess" />
using esegece.sgcWebSockets;

// the report
var report = new TsgcHTMLReport();
report.Title = "Sales";
report.FileName = "sales";
var param = report.Parameters.Add();
param.Name = "Period";
param.Caption = "Period";
param.Kind = TsgcHTMLReportParameterKind.rpkDateRange;
param.DefaultValue = "2026-01-01;2026-12-31";
param.Required = true;
report.OnBeforeGenerate += (sender, values) => LoadSales(values);

// the viewer
var viewer = new TsgcHTMLComponent_ReportViewer();
viewer.Name = "SalesViewer";
viewer.HTMXEngine = engine;
viewer.Report = report;
viewer.TokenSecret = configuration["Reports:Secret"];
template.BodyContent = viewer.HTML;

// the same report, without the viewer: a PDF of the third quarter
var values = new List<string> { "Period=2026-07-01;2026-09-30" };
report.SaveToFile("q3.pdf", values);

Ce que vos utilisateurs obtiennent

Choisissez les valeurs, regardez le rapport, puis téléchargez-le, imprimez-le ou ouvrez ses données dans Excel.

Panneau de paramètres

Chaque paramètre du rapport devient un champ avec libellé : texte, nombre, date, plage de dates avec Du et Au, liste de choix des Options et case à cocher. Un paramètre Required affiche un astérisque et est vérifié dans le navigateur avant Appliquer, puis de nouveau sur le serveur. Réinitialiser restaure la valeur par défaut de chaque champ.

Aperçu PDF

L'aperçu utilise le pdf.js intégré de TsgcHTMLComponent_PDFViewer, avec sa barre d'outils, sa navigation entre les pages, son zoom et sa recherche. Un indicateur avec le texte Génération du rapport... le recouvre jusqu'à ce que la première page soit dessinée. Avec AutoGenerate, l'aperçu se charge immédiatement avec les valeurs par défaut.

Télécharger, imprimer et Excel

Télécharger le PDF et Imprimer sont le même PDF que l'aperçu, et le téléchargement porte le nom de FileName. Exporter vers Excel écrit les données du rapport avec ExportToXLSX. ShowDownload, ShowPrint et ShowExportXLSX affichent ou masquent chacun d'eux.

Messages clairs

Une valeur obligatoire manquante marque le champ et y déplace le focus. Lorsqu'aucune ligne ne s'imprime, l'aperçu affiche Aucune donnée pour les paramètres sélectionnés au lieu d'un PDF vide. Une génération refusée ou en échec affiche sa raison et désactive les liens. Les textes proviennent de la locale de la bibliothèque.

Accessibilité et clavier

Le visualiseur est une région étiquetée. Chaque champ a un libellé, une plage de dates est un fieldset avec une légende, les champs obligatoires portent aria-required et une valeur manquante définit aria-invalid. Entrée dans un champ applique les paramètres, et une région live polie annonce les champs obligatoires, l'absence de données, les refus et les erreurs.

Rapports par bandes vers PDF

Le moteur derrière le visualiseur est un composant non visuel à part entière. Il écrit le PDF avec TsgcHTMLExportPDF, le moteur PDF de sgcHTML, et le même rapport peut aussi être écrit sous forme de feuille Excel.

Bandes

Un en-tête de rapport, des en-têtes de page, des groupes imbriqués avec en-têtes et pieds, des lignes de détail, des pieds de page et un pied de rapport. Les en-têtes de groupe peuvent se répéter à chaque nouvelle page, KeepTogether garde un groupe sur une seule page, NewPageBefore et NewPageAfter provoquent des sauts de page, et un en-tête de rapport avec NewPageAfter est une page de garde.

Éléments

Les bandes contiennent du texte, des images, des lignes, des rectangles, des graphiques, du texte enrichi, des codes-barres, des codes QR et des sous-rapports. Le texte est coupé à sa boîte, et les éléments avec AutoHeight agrandissent la bande pour contenir le texte renvoyé à la ligne.

Expressions et PrintIf

Les textes contiennent des expressions entre [ ] : des champs avec un masque comme [Amount:#,##0.00], [Sum(Field)], [Count], [Avg(Field)], [Min(Field)], [Max(Field)], [RunningSum(Field)], [Page] sur [Pages], [Param.Name] et [GroupValue]. Les bandes et les éléments ne s'impriment que lorsque leur condition PrintIf est vraie, comme Amount > 1000.

Sources de données

Les lignes proviennent d'un DataSet, d'une Grid, d'un tableau JSON dans RowsJSON ou de l'événement OnGetRow. LoadFromGrid construit un rapport de type tableau à partir des colonnes d'une TsgcHTMLComponent_Grid, avec les intitulés sur chaque page, des lignes zébrées, les totaux des colonnes numériques et les numéros de page.

Graphiques, codes-barres et codes QR

Un élément graphique dessine les lignes de sa bande en graphiques vectoriels : barres, barres horizontales, barres empilées, courbes, aires, secteurs ou anneau, un graphique par groupe dans une bande de groupe. ChartSource imprime un TsgcHTMLComponent_Chart tel que la page web l'affiche. Les éléments code-barres dessinent du Code 128, et les éléments code QR utilisent le niveau de correction d'erreur M.

Sous-rapports et texte enrichi

Un élément sous-rapport imprime un autre rapport dans sa bande, comme les lignes d'une commande, lié à la ligne maître par LinkFields, jusqu'à 5 niveaux de profondeur, et se poursuit sur les pages suivantes. Un élément texte enrichi imprime du HTML, et avec AutoHeight il s'étend sur plusieurs pages après les en-têtes de page.

Polices et langues

Les éléments s'impriment par défaut avec les polices Base-14, qui contiennent les caractères de Windows-1252. Enregistrez des polices TrueType dans Fonts pour imprimer le cyrillique, le grec, l'arabe, l'hébreu, le chinois, le japonais, le coréen ou des symboles. Seuls les glyphes imprimés sont intégrés, et FallbackFonts et AutoFallback couvrent les caractères qu'une police ne possède pas.

Même résultat partout

Les nombres et les dates s'impriment avec DecimalSeparator, ThousandSeparator, DateFormat et TimeFormat du rapport, jamais avec les paramètres régionaux de la machine, de sorte qu'un rapport s'imprime de la même façon sur tous les ordinateurs et sous .NET. Avec un CreationDate fixe, la même entrée donne les mêmes octets de PDF.

Définition en JSON

SaveToJSON écrit la mise en page, les polices, les bandes, les éléments et les paramètres, et LoadFromJSON les relit après avoir validé toute la définition, avec le chemin JSON de chaque erreur. Les utilisateurs conçoivent des rapports dans le navigateur avec le Report Designer, et un double-clic sur le rapport ouvre le même concepteur dans l'IDE Delphi.

Un rapport, de nombreuses requêtes

Generate, SaveToFile, SaveToStream, GetPDFBytes, ExportToXLSX et HasData construisent chacun leur propre copie des lignes et de la mise en page. Un seul rapport sert plusieurs requêtes d'un serveur web en même temps, chacune filtrée avec ses propres paramètres, sans verrou de votre part.

Propriétés, méthodes & événements clés

Les membres du visualiseur que vous utiliserez le plus souvent.

Report et OnGetReport

Report est le TsgcHTMLReport à afficher. Un visualiseur sert tous les utilisateurs : pour montrer à chacun un rapport différent, par exemple par locataire ou par rôle, renvoyez-le dans OnGetReport(Sender, aParams, aReport), qui se déclenche sur le thread de la requête où sgcHTMLRequestSession donne la session.

OnBeforeGenerate

OnBeforeGenerate(Sender, aParams, aAccept, aErrorMessage) accepte ou refuse une génération, quand le visualiseur se rend, à chaque Appliquer et à chaque GET d'un lien, de sorte qu'un lien copié est refusé lui aussi. Utilisez-le pour les permissions et pour les règles entre paramètres, comme une période d'un an au plus.

Liens signés

Chaque lien de fichier porte un jeton HMAC-SHA256 sur le composant, le format, les valeurs des paramètres, la session et l'expiration, et ne fonctionne que dans la session qui l'a rendu. Les liens expirent après TokenLifetime secondes (300 par défaut), et le script en signe de nouveaux pour une page laissée ouverte. Définissez le même TokenSecret sur chaque serveur derrière un répartiteur de charge.

Aucun état serveur

Les valeurs voyagent dans le lien, et le rapport est généré sur le GET, après une nouvelle exécution de OnGetReport et OnBeforeGenerate. Les fichiers sont servis avec Cache-Control: private, no-store, et une requête incorrecte, un jeton incorrect ou un refus répondent 400 ou 403.

Options de l'aperçu

ShowParameters, ShowToolbar, ShowPageNav, ShowZoomControls et ShowSearch définissent ce que le visualiseur affiche, Zoom accepte auto, page-width, fit ou un pourcentage, et Theme et CSSHeight définissent l'aspect de l'aperçu.

Sans moteur

Avec ActionURL et sans HTMXEngine, votre hôte achemine l'envoi d'Appliquer vers DispatchComponentEvent et les liens de fichiers vers DispatchComponentFile. GetReportURL signe les mêmes liens pour votre propre code, par exemple pour envoyer dans un message un lien vers le PDF d'une période.

ASP.NET Core

Dans une vue Razor, le Tag Helper <sgc-report-viewer> rend le visualiseur. report accepte un TsgcHTMLReport de longue durée de vie, ou omettez-le et utilisez on-get-report. Appliquer envoie vers le point de terminaison des événements de composants et les liens PDF et Excel sont servis par la route de fichiers de composants de UseSgcHtml, donc rien n'est à mapper.

La démo

Demos\60.HTML\01.RunTime\31.ReportViewer est sgc Sales Reports, un serveur sur le port 8133 avec trois rapports : les ventes par région avec un graphique à barres par région et un anneau de la part de chaque région, une facture avec un logo, un code QR de paiement et un code-barres Code 128, et une impression d'une grille. Le bouton New order ajoute une commande, et chaque aperçu ouvert, dans chaque navigateur, applique de nouveau ses paramètres via le WebSocket de la page. Les versions design time, Lazarus et .NET en sont le miroir.

Continuez l'exploration

Essayer en ligneVoyez-le dans la démo Visionneuse de rapports, en fonctionnement direct sur le serveur de démos d'eSeGeCe.
Aide en ligneRéférence complète de l'API et guide d'utilisation du visualiseur.
Aide TsgcHTMLReportBandes, expressions, graphiques, sous-rapports, polices et définition JSON du moteur de rapports.
Composant Report DesignerConcevez dans le navigateur les bandes, les éléments et les paramètres d'un rapport.
Composant PDF ViewerLe visualiseur pdf.js qui dessine l'aperçu du rapport.
Tous les composants sgcHTMLParcourez la matrice complète des fonctionnalités de plus de 80 composants.
Télécharger la version d'essai gratuiteLa version d'essai de 30 jours fournit les projets de démonstration 60.HTML.
TarifsLicences Single, Team et Site avec code source complet.
Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Prêt à démarrer ?

Téléchargez la version d'essai gratuite et commencez à créer des interfaces web en Delphi, C++ Builder et .NET.