ASP.NET Core和Angular(>2.0)的本地RDLC报表查看器

17

有没有办法在ASP.NET Core网页中显示RDLC本地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,但与 ASP.NET Core 不兼容。
  2. MvcReportViewer - 适用于 MVC,但与 ASP.NET Core 不兼容(请参见此问题:https://github.com/ilich/MvcReportViewer/issues/121)。
  3. MvcReportViewer - 不使用微软查看器控件,因此支持 aspnet core,但不支持本地报表(需要报表服务器url)。
  4. ngx-ssrs-reportviewer npm 包装程序 - 对远程报表进行包装,不支持本地报表。(需要报表服务器url)

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


8
下投票者,能否告诉我为什么要给我点“踩”的?这样我就可以相应地更新问题了。 - int-i
  1. 问题是什么?
  2. 如果你在寻求类似的内容,那么这是不相关的。请阅读此链接了解如何提出相关问题。
- Tseng
3
@Tseng:我已经重新表述了问题。希望现在清楚了。 - int-i
简短回答,在睡觉前:ASP.NET Core 中没有控件和 aspx。如果您真的依赖它,请继续使用 ASP.NET MVC5,直到所有依赖项都可用于 .NET Standard/ASP.NET Core。 - Tseng
4
问题主要是关于“如何在ASP.NET Core项目上使用Microsoft报表查看器”。具体的实现细节可能有所不同。 - int-i
5个回答

15
微软将不会在ASP.NET Core中实现或引入RDLC报表查看器。相反,他们正在购买一种产品来填补这个空白。
新闻的完整链接- 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)。正如您在我们的2018年春季发布说明中所看到的,我们正在积极努力将SSRS报告带入Power BI云服务,并且我们正在构建客户端呈现以实现这一目标。您想要在手机上查看SSRS报告,可能使用Power BI应用程序。我们相信,这项技术将帮助我们提供更好、响应更快的用户界面,以提供报告参数值、在报告内导航,甚至可能查看报告内容。

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

这些是庞大的工程,我们还没有时间表可以分享,但请在未来几个月内保持关注,因为我们始终努力与您分享我们的进展,并尽早并经常听取您的反馈意见。

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


2023年了,他们购买Forerunner Software有什么结果吗?GitHub的问题已经被锁定了。 - undefined

8
为了让James的解决方案起作用,需要引用完整的.NET Framework。这对于ASP.NET Core 1和2来说很好,然而 - 众所周知 - ASP.NET 3将不允许您引用完整的.NET Framework。
目前,只有使用.NET Core才能使用SSRS托管服务器报表(RDL)报表。对于客户端 RDLC 报告,目前仅付费Syncfusion解决方案可行(我已测试过试用版本)
在ASP.NET Core 3中,James的解决方案完全无效(因为它只允许您引用.NET Core而不是完整的.NET Framework)。

4
如果问题是如何在ASP.NET Core项目中使用Microsoft Reportviewer,不考虑实现细节,我的解决方案是绕过实际的reportviewer控件,直接将报告呈现为PDF或Excel。这适用于.net Core 1.1。我们使用的NuGet包是 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);
        }
    }
}

2
这个例子在 .net Core 1.1 MVC 应用程序中运行良好,但我们已经将其实现在一个解决方案中,其中包含 .net Core MVC 和 .net 4.6 库,但没有 System.Web。它仍然可以编译和执行,但为了向报表添加基于 C# 类的数据集,我们需要暂时将 RDLC 移动到引用 System.Web 的 .net MVC 项目中。 - lienn
但是如果直接生成PDF,你如何制作它的布局? - André Miranda
布局在.rdlc文件中,使用Visual Studio中的报表编辑器创建。LocalReport的渲染方法通过将第一个参数指定为“PDF”来创建pdf格式的文件。它也可以是“Excel”或“Word”。 - lienn
@LuisAbreu,你有没有找到一个可以针对Core 2.x的解决方案? - tomRedox
感谢@LuisAbreu的更新。最终,我为rdlc添加了一个完整的.NET Framework Web API,并在其中引用了所有我们的.NET标准库代码。现在我有两个站点,一个是具有MVC UI的Core站点,另一个是.NET Framework API站点。这对我来说非常有效,因为我只是使用ReportViewer生成PDF而不是实际查看报表。 - tomRedox
显示剩余5条评论

2
我发现了一个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")
}

2
你好!你在这里引用了哪些程序集? - Bellash
1
参考哪个库? - Sras

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 );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接