17

有没有办法在 asp.net 核心网页中显示 RDLC Local ReportViewer 控件?

为了在传统的 WebForms 应用程序上显示 ReportViewer,下面的代码可以工作。

<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>

我已经尝试并测试了以下组件。结果如下。

  1. ReportViewerForMvc - 适用于 MVC,但与 ASPNET Core 不兼容。
  2. MvcReportViewer - 适用于 MVC,但与 ASPNET Core 不兼容(请参阅此问题:https ://github.com/ilich/MvcReportViewer/issues/121 )。
  3. MvcReportViewer - 不使用 microsoft 查看器控件,因此支持 aspnet 核心,但不适用于本地报表(需要报表服务器 url)。
  4. ngx-ssrs-reportviewer npm 包 - 远程报告的包装器,不支持本地报告。(需要报告服务器 url)

Q1。<rsweb:ReportViewer>在 asp.net 核心应用程序中使用的最佳方法是什么?

4

5 回答 5

15

Microsoft 没有实施或将 RDLC 报告查看器引入 aspnet 核心。相反,他们正在购买产品来填补空白。

新闻的完整链接 - https://blogs.msdn.microsoft.com/sqlrsteamblog/2018/04/02/microsoft-acquires-report-rendering-technology-from-forerunner-software/

链接到原始问题 - https://github.com/aspnet/Home/issues/1528

这里是精髓。“微软从 Forerunner Software 收购报表渲染技术

我们很高兴地宣布,我们从 Forerunner Software 获得了技术,以加快我们对 Reporting Services 的投资。除其他外,该技术包括 Reporting Services (*.rdl) 报告的客户端呈现、用于查看报告的响应式 UI 小部件以及用于将报告集成到其他应用程序的 JavaScript SDK——这证明了我们的合作伙伴可以在此基础上实现的目标我们的开放平台。

这对您来说是个好消息,因为我们看到了将这项技术应用于我们从您那里听到的多个反馈点的机会:

您正在寻找可以运行 SSRS 报告的云软件即服务 (SaaS) 或平台即服务 (PaaS)。正如您可能在我们的 Spring '18 发行说明中看到的那样,我们正在积极致力于将 SSRS 报告引入 Power BI 云服务,并且我们正在构建客户端渲染以实现这一目标。你想在手机上查看 SSRS 报告,可能使用 Power BI 应用。我们相信这项技术将帮助我们提供更好、响应更快的 UI,用于提供报告参数值、在报告中导航,甚至可能查看报告内容。

您喜欢 Report Viewer 控件……但它是一个 ASP.NET Web 窗体控件。你需要一些可以集成到 ASP.NET Core/MVC 应用程序或非 ASP.NET 应用程序中的东西。通过这项技术,我们希望提供一个客户端/基于 JavaScript 的报表查看器,您可以将其集成到任何现代应用程序中。

这些都是大工程,我们还没有时间表可以分享,但请继续关注接下来的几个月,因为我们一直努力与您分享我们的进展,并尽可能早且经常地听取您的反馈。

Forerunner Software 将在有限的时间内继续为现有客户提供支持。”

于 2018-04-24T19:06:26.107 回答
7

In order for Jame's solution to work - it requires that you reference the full .NET Framework. This is all well and good for ASP.NET Core 1 and 2, however - as everyone should be aware by now - ASP .NET 3 will NOT allow you to reference the full .NET Framework.

Currently, it's only possible to use SSRS hosted server reports (RDL) reports with .NET Core. For client RDLC reports, currently only the paid Syncfusion solution works (I've tested the trail version)

James solution will is entirely invalid with ASP.NET Core 3 (which again - only allows you to reference .NET Core - not the .NET Framework)

于 2019-08-27T17:22:31.697 回答
4

如果问题是如何在 ASP.NET Core 项目上使用 Microsoft Reportviewer,不管实现细节如何,我的解决方案是绕过实际的 reportviewer 控件,直接将报表呈现为 PDF 或 Excel。它适用于 .net Core 1.1。我们使用的 NuGet 包是Fornax 的 Microsoft.ReportViewer.2012.Runtime

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);
        }
    }
}
于 2018-03-25T17:22:12.363 回答
1

找到了一个 npm 包ng2-pdfjs-viewer,虽然它不是 MS 报告查看器,但如果您愿意使用 PDFJS,该包的文档在类似的行中有一个示例,可以使用 LocalReport 查看器生成 pdf 和 ng2-pdfjs -viewer 在浏览器中显示 - ( 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")
}
于 2019-06-04T15:59:28.200 回答
0
public List<object> _dataSourceList = new List<object>();
public string _dataSourceName { get; set; }

public string _reportPath = CommonUtil.Report_path; //set your report path in app.config file
public Dictionary<string, string> Parameters = new Dictionary<string, string>();

public void PDFPrint_Load() {

  string mimtype="";
  int extension = 1;

  LocalReport localReport= new LocalReport(_reportPath);
  localReport.AddDataSource(_dataSourceName, _dataSourceList);

  if (Parameters != null && Parameters.Count > 0)// if you use parameter in report
  {
    List<ReportParameter> reportparameter = new List<ReportParameter>();
    foreach (var record in Parameters) {
      reportparameter.Add(new ReportParameter());
    }
  }
  var result = localReport.Execute(RenderType.Pdf, extension,parameters: 
  Parameters, mimtype);

  byte[] bytes = result.MainStream;
  string fileName = "Report.pdf";
  return File(bytes , "application/pdf",fileName );
}
于 2019-02-22T11:10:30.283 回答