【发布时间】:2019-02-16 12:35:45
【问题描述】:
我正在尝试在 C# 中构建一个方法来让 SSRS Reportviewer 生成 PDF 输出。
关于这个主题的信息很多,所以这似乎是一件容易的事。
当我的数据源来自 XML URL 时,就会出现问题。
这是我的方法:
private void GetPDF(Stream RDL)
{
Warning[] warnings = null;
string[] streamIds = null;
string mimeType = string.Empty;
string encoding = string.Empty;
string extension = string.Empty;
string filetype = string.Empty;
ReportViewer RPT = new ReportViewer();
RPT.ProcessingMode = ProcessingMode.Local;
RPT.LocalReport.LoadReportDefinition(RDL);
RPT.LocalReport.Refresh();
byte[] Bytes = RPT.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
using (FileStream PDF = new FileStream("test.PDF", FileMode.Create))
{
PDF.Write(Bytes, 0, Bytes.Length);
}
}
报表在 ReportBuilder 桌面应用程序中运行良好。如您所见,我删除了所有动态内容(报告 URL、参数等)以简化和检测问题来源。
无奈之下,我还尝试将 XML 数据嵌入到报告中。
错误总是一样的:
无法为数据集(报表上第一个数据集的名称)创建数据读取器
数据集查询如下所示:
<Query>
<ElementPath IgnoreNamespaces='true'>
Object1 {
Element1,
Element2
}
</ElementPath>
</Query>
请帮忙!!
解决方案:
我已经解决了这个问题,我想分享我的解决方案,这样你就不用在同样的问题上投入太多时间了。
问题是由报表查看器控件产生的,因为它没有“查询”功能。
然后,我的解决方案是使用报告中所需的确切数据构建数据集。
XML 由 C# 类下载。数据被收集、过滤并作为数据集发送到 RDL。
最终的方法是这样的:
private MemoryStream RenderPDFFromXML(Stream RDL, Stream XML)
{
Warning[] warnings = null;
string[] streamIds = null;
string mimeType = string.Empty;
string encoding = string.Empty;
string extension = string.Empty;
string filetype = string.Empty;
ReportViewer RPT = new ReportViewer();
RPT.ProcessingMode = ProcessingMode.Local;
RPT.LocalReport.LoadReportDefinition(RDL);
DataSet DS = new DataSet();
XML.Position = 0;
DS.ReadXml(XML);
ReportDataSource RDS;
foreach (DataTable DT in DS.Tables)
{
RDS = new ReportDataSource(DT.TableName, DT);
RPT.LocalReport.DataSources.Add(RDS);
}
RPT.LocalReport.Refresh();
byte[] Bytes = RPT.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
return new MemoryStream(Bytes);
}
【问题讨论】:
标签: c# xml reporting-services rdlc