web-dev-qa-db-fra.com

Visionneuse de rapports locale RDLC pour ASP.NET Core et Angular (> 2.0)

Existe-t-il un moyen d'afficher le contrôle RDLC Local ReportViewer dans la page Web principale asp.net?

Pour afficher un ReportViewer, sur une application WebForms traditionnelle, le code ci-dessous fonctionne.

<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>

        <div style="height: 600px;">
            <rsweb:ReportViewer ID="reportViewer" runat="server" Width="100%" Height="100%"></rsweb:ReportViewer>
        </div>
    </form>
</body>

J'ai déjà essayé et testé les composants ci-dessous. Les résultats sont donnés ci-dessous.

  1. ReportViewerForMvc - Fonctionne pour MVC, mais n'est pas compatible avec ASPNET Core.
  2. MvcReportViewer - Fonctionne pour MVC, mais n'est pas compatible avec ASPNET Core (Voir ce problème: https://github.com/ilich/MvcReportViewer/issues/121 ).
  3. MvcReportViewer - N'utilise pas le contrôle de la visionneuse Microsoft, prend donc en charge le noyau aspnet, mais ne fonctionne pas avec les rapports locaux (besoin d'une URL de serveur de rapports).
  4. ngx-ssrs-reportviewer package npm - Un wrapper sur les rapports distants, ne prend pas en charge les rapports locaux. (Besoin d'une URL de serveur de rapports)

Q1. Quelle est la meilleure approche pour utiliser <rsweb:ReportViewer> dans l'application principale asp.net?

10
int-i

Trouvé un paquet npm ng2-pdfjs-viewer , bien que ce ne soit pas tout à fait le visualiseur de rapports MS, si vous êtes prêt à utiliser PDFJS, la documentation de la le package a un exemple sur des lignes similaires pour utiliser la visionneuse LocalReport pour générer le pdf et la visionneuse ng2-pdfjs pour l'afficher dans le navigateur --- (https://www.npmjs.com/package/ng2-pdfjs-viewer =)

<!-- your.component.html -->
<button (click)="openPdf();">Open Pdf</button>
<!-- your.component.ts-->
export class MyComponent implements OnInit {
  @ViewChild('pdfViewer') pdfViewer
  ...

  private downloadFile(url: string): any {
    return this.http.get(url, { responseType: ResponseContentType.Blob }).map(
      (res) => {
        return new Blob([res.blob()], { type: "application/pdf" });
      });
  }

  public openPdf() {
    let url = "http://localhost:4200/api/GetMyPdf
    this.downloadFile(url).subscribe(
    (res) => {
        this.pdfViewer.pdfSrc = res; // pdfSrc can be Blob or Uint8Array
        this.pdfViewer.refresh(); // Ask pdf viewer to load/reresh pdf
      }
    );
  }
[HttpGet]
[Route("MyReport")]
public IActionResult GetReport()
{
   var reportViewer = new ReportViewer {ProcessingMode = ProcessingMode.Local};
   reportViewer.LocalReport.ReportPath = "Reports/MyReport.rdlc";

   reportViewer.LocalReport.DataSources.Add(new ReportDataSource("NameOfDataSource1", reportObjectList1));
   reportViewer.LocalReport.DataSources.Add(new ReportDataSource("NameOfDataSource2", reportObjectList1));

   Warning[] warnings;
   string[] streamids;
   string mimeType;
   string encoding;
   string extension;

   var bytes = reportViewer.LocalReport.Render("application/pdf", null, out mimeType, out encoding, out extension, out streamids, out warnings);

   return File(bytes, "application/pdf")
}
2
James

Microsoft n'implémente pas ou n'apporte pas la visionneuse de rapports RDLC dans le noyau aspnet. Au lieu de cela, ils achètent un produit pour combler le vide.

Lien complet vers les actualités - https://blogs.msdn.Microsoft.com/sqlrsteamblog/2018/04/02/Microsoft-acquires-report-rendering-technology-from-forerunner-software/

Lien vers le problème d'origine - https://github.com/aspnet/Home/issues/1528

Voici l'essentiel. "Microsoft acquiert la technologie de rendu de rapport de Forerunner Software

Nous sommes heureux d'annoncer que nous avons acquis la technologie de Forerunner Software pour accélérer nos investissements dans Reporting Services. Cette technologie comprend, entre autres, le rendu côté client des rapports Reporting Services (* .rdl), des widgets d'interface utilisateur réactifs pour afficher les rapports et un SDK JavaScript pour intégrer les rapports dans d'autres applications - un témoignage de ce que nos partenaires peuvent réaliser en s'appuyant sur notre plateforme ouverte.

C'est une excellente nouvelle pour vous, car nous voyons des opportunités d'appliquer cette technologie à plusieurs points de rétroaction que nous avons entendus de votre part:

Vous recherchez un logiciel en tant que service cloud (SaaS) ou une plate-forme en tant que service (PaaS) capable d'exécuter des rapports SSRS. Comme vous l'avez peut-être vu dans nos notes de publication de printemps 18, nous travaillons activement à apporter des rapports SSRS au service cloud Power BI, et nous nous appuyons sur le rendu côté client pour rendre cela possible. Vous souhaitez afficher les rapports SSRS sur votre téléphone, peut-être à l'aide de l'application Power BI. Nous pensons que cette technologie nous aidera à fournir une interface utilisateur meilleure et plus réactive pour fournir des valeurs de paramètres de rapport, naviguer dans les rapports et peut-être même afficher le contenu du rapport.

Vous aimez le contrôle Report Viewer… mais c'est un contrôle ASP.NET Web Forms. Vous avez besoin de quelque chose que vous pouvez intégrer dans votre application ASP.NET Core/MVC ou application nonASP.NET. Avec cette technologie, nous espérons offrir une visionneuse de rapports côté client/basée sur JavaScript que vous pourrez intégrer dans n'importe quelle application moderne.

Ce sont de grandes entreprises et nous n'avons pas encore de délais à partager, mais restez à l'écoute au cours des prochains mois car nous nous efforçons toujours de partager nos progrès avec vous et d'entendre vos commentaires le plus tôt et le plus souvent possible.

Forerunner Software continuera de prendre en charge les clients existants pendant une période limitée. "

7
int-i

Si la question est de savoir comment utiliser Microsoft Reportviewer sur le projet ASP.NET Core, quels que soient les détails d'implémentation, ma solution consiste à contourner le contrôle réel de Reportviewer et à rendre les rapports directement à PDF ou Excel. Cela fonctionne dans .net Core 1.1. Le package NuGet que nous utilisons est Microsoft.ReportViewer.2012.Runtime by Fornax .

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Reporting.WebForms;

namespace WebApplication3.Controllers
{
    public class ReportController : Controller
    {
        private readonly IHostingEnvironment environment = null;
        public ReportController(IHostingEnvironment environment)
        {
            this.environment = environment;
        }
        public IActionResult Report()
        {
            string mimeType;
            string encoding;
            string filenameExtension;
            string[] streams;
            Warning[] warnings;
            var rv = new ReportViewer();
            rv.ProcessingMode = ProcessingMode.Local;
            rv.LocalReport.ReportPath = Path.Combine(environment.ContentRootPath, "Reports", "Report1.rdlc");
            rv.LocalReport.Refresh();
            var bytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streams, out warnings);
            return File(bytes, mimeType);
        }
    }
}
5
lienn

Pour que la solution de Jame fonctionne - cela nécessite que vous référençiez le .NET Framework complet. C'est bien beau pour ASP.NET Core 1 et 2, cependant - comme tout le monde devrait le savoir maintenant - ASP .NET 3 sera PAS vous permet de référencer le .NET Framework complet.

Actuellement, il est uniquement possible d'utiliser des rapports de rapports de serveurs hébergés SSRS (RDL) avec .NET Core. Pour le client RDLC rapports, actuellement seule la solution payante Syncfusion fonctionne (j'ai testé la version trail)

La solution de James sera entièrement invalide avec ASP.NET Core 3 (qui encore une fois - vous permet uniquement de référencer .NET Core - pas le .NET Framework)

3
Muaddib878