ASP.NET Core 和 Angular(>2.0) 的 RDLC 本地报告查看器
RDLC Local report viewer for ASP.NET Core and Angular(>2.0)
有什么方法可以在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>
我已经尝试并测试了以下组件。结果如下。
- ReportViewerForMvc - 适用于 MVC,但与 ASPNET Core 不兼容。
- MvcReportViewer - Works for MVC, but not compatible with ASPNET Core(See this issue: https://github.com/ilich/MvcReportViewer/issues/121).
- MvcReportViewer - 不使用 Microsoft 查看器控件,因此支持 aspnet 核心,但不适用于本地报表(需要报表服务器 url)。
- ngx-ssrs-reportviewer npm 包 - 远程报告的包装器,不支持本地报告。(需要报告服务器 url)
Q1。在 asp.net 核心应用程序中使用 <rsweb:ReportViewer>
的最佳方法是什么?
如果问题是如何在 ASP.NET 核心项目上使用 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);
}
}
}
Microsoft 未实施或将 RDLC 报告查看器引入 aspnet 核心。相反,他们正在购买产品来填补空白。
Link 到原始问题 - https://github.com/aspnet/Home/issues/1528
这里是精华。
"Microsoft 从 Fore运行ner Software
获得报表渲染技术
我们很高兴地宣布,我们已经从 Fore运行ner Software 获得了技术,以加速我们在 Reporting Services 方面的投资。该技术包括 Reporting Services (*.rdl) 报告的客户端呈现、用于查看报告的响应式 UI 小部件以及用于将报告集成到其他应用程序中的 JavaScript SDK – 证明我们的合作伙伴可以在我们的开放平台上实现什么。
这对您来说是个好消息,因为我们看到了将这项技术应用于我们从您那里听到的多个反馈点的机会:
您正在寻找可以 运行 SSRS 报告的云软件即服务 (SaaS) 或平台即服务 (PaaS)。正如您可能在我们的 Spring ’18 发行说明中看到的那样,我们正在积极致力于将 SSRS 报告引入 Power BI 云服务,并且我们正在构建客户端呈现以实现这一目标。
您想要在您的 phone 上查看 SSRS 报告,也许使用 Power BI 应用程序。我们相信这项技术将帮助我们提供更好、更灵敏的 UI 来提供报告参数值、在报告中导航,甚至可能查看报告内容。
您喜欢报表查看器控件……但它是一个 ASP.NET Web 窗体控件。您需要可以集成到 ASP.NET Core/MVC 应用程序或非 ASP.NET 应用程序中的东西。借助这项技术,我们希望提供一个 client-side/JavaScript-based 报表查看器,您可以将其集成到任何现代应用程序中。
这些是一项艰巨的任务,我们还没有时间框架可以分享,但在接下来的几个月里请继续关注,因为我们一直努力与您分享我们的进展并尽早并经常听取您的反馈。
Fore运行ner Software 将在有限的时间内继续支持现有客户。"
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 );
}
找到一个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")
}
为了让 Jame 的解决方案起作用 - 它需要您引用完整的 .NET Framework。这对 ASP.NET Core 1 和 2 来说都很好,但是 - 现在每个人都应该知道 - ASP .NET 3 将 NOT 允许你参考完整的 .NET Framework。
目前,只能将 SSRS 托管服务器报告 (RDL) 报告与 .NET Core 一起使用。对于客户 RDLC 报告,目前只有付费的 Syncfusion 解决方案有效(我已经测试了试用版)
James 解决方案将对 ASP.NET Core 3 完全无效(同样 - 只允许您引用 .NET Core - 而不是 .NET Framework)
有什么方法可以在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>
我已经尝试并测试了以下组件。结果如下。
- ReportViewerForMvc - 适用于 MVC,但与 ASPNET Core 不兼容。
- MvcReportViewer - Works for MVC, but not compatible with ASPNET Core(See this issue: https://github.com/ilich/MvcReportViewer/issues/121).
- MvcReportViewer - 不使用 Microsoft 查看器控件,因此支持 aspnet 核心,但不适用于本地报表(需要报表服务器 url)。
- ngx-ssrs-reportviewer npm 包 - 远程报告的包装器,不支持本地报告。(需要报告服务器 url)
Q1。在 asp.net 核心应用程序中使用 <rsweb:ReportViewer>
的最佳方法是什么?
如果问题是如何在 ASP.NET 核心项目上使用 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);
}
}
}
Microsoft 未实施或将 RDLC 报告查看器引入 aspnet 核心。相反,他们正在购买产品来填补空白。
Link 到原始问题 - https://github.com/aspnet/Home/issues/1528
这里是精华。 "Microsoft 从 Fore运行ner Software
获得报表渲染技术我们很高兴地宣布,我们已经从 Fore运行ner Software 获得了技术,以加速我们在 Reporting Services 方面的投资。该技术包括 Reporting Services (*.rdl) 报告的客户端呈现、用于查看报告的响应式 UI 小部件以及用于将报告集成到其他应用程序中的 JavaScript SDK – 证明我们的合作伙伴可以在我们的开放平台上实现什么。
这对您来说是个好消息,因为我们看到了将这项技术应用于我们从您那里听到的多个反馈点的机会:
您正在寻找可以 运行 SSRS 报告的云软件即服务 (SaaS) 或平台即服务 (PaaS)。正如您可能在我们的 Spring ’18 发行说明中看到的那样,我们正在积极致力于将 SSRS 报告引入 Power BI 云服务,并且我们正在构建客户端呈现以实现这一目标。 您想要在您的 phone 上查看 SSRS 报告,也许使用 Power BI 应用程序。我们相信这项技术将帮助我们提供更好、更灵敏的 UI 来提供报告参数值、在报告中导航,甚至可能查看报告内容。
您喜欢报表查看器控件……但它是一个 ASP.NET Web 窗体控件。您需要可以集成到 ASP.NET Core/MVC 应用程序或非 ASP.NET 应用程序中的东西。借助这项技术,我们希望提供一个 client-side/JavaScript-based 报表查看器,您可以将其集成到任何现代应用程序中。
这些是一项艰巨的任务,我们还没有时间框架可以分享,但在接下来的几个月里请继续关注,因为我们一直努力与您分享我们的进展并尽早并经常听取您的反馈。
Fore运行ner Software 将在有限的时间内继续支持现有客户。"
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 );
}
找到一个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")
}
为了让 Jame 的解决方案起作用 - 它需要您引用完整的 .NET Framework。这对 ASP.NET Core 1 和 2 来说都很好,但是 - 现在每个人都应该知道 - ASP .NET 3 将 NOT 允许你参考完整的 .NET Framework。
目前,只能将 SSRS 托管服务器报告 (RDL) 报告与 .NET Core 一起使用。对于客户 RDLC 报告,目前只有付费的 Syncfusion 解决方案有效(我已经测试了试用版)
James 解决方案将对 ASP.NET Core 3 完全无效(同样 - 只允许您引用 .NET Core - 而不是 .NET Framework)