gpt4 book ai didi

c# - RDLC LocalReport 导出到 Excel 真的很慢

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:01 25 4
gpt4 key购买 nike

我们有一个 Asp.Net 页面在后端针对 Oracle 数据库运行 RDLC 本地报告,这在导出到 Excel 电子表格时速度慢得离谱。我做了一些调查并确定查询本身不应该受到指责 - 我可以使用 SQL Developer 直接针对 Oracle 运行查询并在大约 5 秒内将结果导出到 Excel,但是当我通过 asp.net 页面和 ReportViewer 控件大约需要 3 分钟才能返回。

对于为什么这么慢,有人有什么建议吗?该查询返回大约 8000 行,每行大约 30 列,因此它不是一个很小的结果集,但也不是很大。对于我们如何优化报告的任何建议,我们将不胜感激。

我使用的是 Microsoft.ReportViewer.WebForms 版本 10.0.0.0,有人知道 v11 是否有性能改进吗?

编辑: 已尝试 ReportViewer v11,但速度没有提高。

最佳答案

如果您的 Report 中有分组。从 .NET 4 开始,当遗留 CAS 被删除时,本地处理的 RDLC 报告需要大量时间来执行动态分组或动态过滤器。已有与此相关的讨论 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6d89e2ce-3528-465f-9740-7e22aa7b7aae/slow-performance-with-dynamic-grouping-and-reportviewer-in-local-mode?forum=sqlreportingservices
我在其中找到的最佳解决方案是,
1.创建一个新的 .NET 3.5 库项目并创建一个文件来执行 Report 的实际处理。

using Microsoft.Reporting.WebForms;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;

//As you would expect, the new assembly WebReportviewer.FullTrustReportviewer
//all it does is just run the report. that's it. here is the code, it should be in a separated project:

namespace WebReportviewer
{
[Serializable]
public class FullTrustReportviewer : MarshalByRefObject
{
private ReportViewer FullTrust;
public FullTrustReportviewer()
{
FullTrust = new ReportViewer();
FullTrust.ShowExportControls = false;
FullTrust.ShowPrintButton = true;
FullTrust.ShowZoomControl = true;
FullTrust.SizeToReportContent = false;
FullTrust.ShowReportBody = true;
FullTrust.ShowDocumentMapButton = false;
FullTrust.ShowFindControls = true;
//FullTrust.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing;
//FullTrust.LocalReport.SetBasePermissionsForSandboxAppDomain(new PermissionSet(PermissionState.Unrestricted));
}

public void Initialize(string DisplayName, string ReportPath, bool Visible, ReportParameter[] reportParam, string reportRenderFormat, string deviceInfo, string repMainContent, List<string[]> repSubContent)
{
FullTrust.LocalReport.DisplayName = DisplayName;
FullTrust.LocalReport.ReportPath = ReportPath;
//FullTrust.Visible = Visible;
//FullTrust.LocalReport.LoadReportDefinition(new StringReader(repMainContent));
FullTrust.LocalReport.SetParameters(reportParam);

repSubContent.ForEach(x =>
{
FullTrust.LocalReport.LoadSubreportDefinition(x[0], new StringReader(x[1]));
});
FullTrust.LocalReport.DataSources.Clear();
}

public byte[] Render(string reportRenderFormat, string deviceInfo)
{
return FullTrust.LocalReport.Render(reportRenderFormat, deviceInfo);
}
public void AddDataSources(string p, DataTable datatable)
{
FullTrust.LocalReport.DataSources.Add(new ReportDataSource(p, datatable));
}

public SubreportProcessingEventHandler SubreportProcessing { get; set; }

public static void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
LocalReport lr = (LocalReport)sender;

e.DataSources.Clear();
ReportDataSource rds;

if (e.ReportPath.Contains("DataTable2"))
{
DataTable dt = (DataTable)lr.DataSources["DataTable2"].Value;
DataView dv = new DataView(dt);
dv.RowFilter = string.Format("Id={0}", e.Parameters["Id"].Values[0]);
rds = new ReportDataSource("DataTable2", dv.ToTable());
e.DataSources.Add(rds);
}
}
}
}

2。从现有项目中调用代码

 public static byte[] GeneratePBAReport()
{


string l_spName = string.Empty;
string l_reportPath = string.Empty;
var repCol = new List<ReportDataSource>();

var repParCol = new ReportParameter[1];
if (id == "")
{

l_reportPath = HttpContext.Current.Server.MapPath("~\\.rdlc");
l_spName = "";
}
else
{
l_reportPath = HttpContext.Current.Server.MapPath("~\\.rdlc");
l_spName = "";
}

repParCol[0] = new ReportParameter("pID", "");

var ds = new DataSet();
using (var sqlCmd = new SqlCommand(l_spName, new SqlConnection(ConfigurationManager.ConnectionStrings[""].ConnectionString)))
{
sqlCmd.CommandType = CommandType.StoredProcedure;
var sqlParam = new SqlParameter() { Value = "", ParameterName = "" };
sqlCmd.Parameters.Add(sqlParam);
sqlCmd.CommandTimeout = 300;
using (var sqlAdapter = new SqlDataAdapter(sqlCmd))
{
sqlAdapter.Fill(ds);
}
}

var rds = new ReportDataSource();
rds.Name = "";
rds.Value = ds.Tables[0];
//l_report.DataSources.Add(rds);
repCol.Add(rds);

rds = new ReportDataSource();
rds.Name = "";
rds.Value = ds.Tables[1];
//l_report.DataSources.Add(rds);
repCol.Add(rds);

rds = new ReportDataSource();
rds.Name = "";
rds.Value = ds.Tables[2];
//l_report.DataSources.Add(rds);
repCol.Add(rds);

rds = new ReportDataSource();
rds.Name = "";
rds.Value = ds.Tables[3];
//l_report.DataSources.Add(rds);
repCol.Add(rds);

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


deviceInfo = "<DeviceInfo><SimplePageHeaders>True</SimplePageHeaders></DeviceInfo>";

return NewDomainReport.Render("PDF", deviceInfo, "-" , l_reportPath, true, repCol, string.Empty, new List<string[]>(), repParCol);
}

对于真正快速的测试,您可以尝试在 web.config 中添加 CAS,如文章中所述。

在 ASP 网络应用程序中,您可以使用 <trust legacyCasModel="true" level="Full"/>在 web.config 文件的 system.web 部分中实现相同的结果。

如果速度显着提高,上面的代码将表现相同。上面代码的好处是创建一个单独的 AppDomain 而不是影响整个解决方案。

关于c# - RDLC LocalReport 导出到 Excel 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23787853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com