以编程方式在C#中将SSRS报告另存为PDF

时间:2015-05-07 08:15:45

标签: c# reporting-services report

我已经阅读了关于这个问题的多篇文章,但是他们最终都没有工作,或者是在vb.net中。

我目前拥有的内容:

通过URL访问报告,将其呈现为PDF并在用户单击按钮时将其保存在下载文件夹中,这些文件具有通用名称,如OrderReport,OrderReport(1)......等等

var orderNum = 1;

"http://Server/ReportServer_Name/Pages/ReportViewer.aspx?%2fOrderReport&rs:Command=Render&OrderID=" + orderNum + "&rs:ClearSession=true&rs:Format=PDF"

我想要实现的目标:

  • 如果可能,我想使用C#获取此报告,然后指定PDF文件的名称并将其保存在正确的位置。

例如,我想将此报告保存在临时文件夹中,暂时为“ C:\ temp ”,名称为 OrderID-1 。我正在使用C#

我在ServiceReference中添加了一个名为ReportTestings的项目所以参考是

using ReportTestings;

和网络参考网址:

http://Server/ReportServer_Name/ReportExecution2005.asmx

(出于安全原因删除了实际名称)

所以基于以上所有这些信息,有人可能会指出我正确的方向或给出代码的一部分示例,感谢所有读过这篇文章的人或帮助

使用此代码我收到此错误:(+ e

{"Access to the path 'C:\\Program Files (x86)\\IIS Express\\report1one.pdf' is denied."}    System.Exception {System.UnauthorizedAccessException})

代码:

    ReportExecutionService rs = new ReportExecutionService();
    rs.Credentials = new NetworkCredential("username", "password", "domain");
    rs.Url = "http://Server/ReportServer_Name/reportexecution2005.asmx";

    // Render arguments
    byte[] result = null;
    string reportPath = "/Invoice";
    string format = "PDF";
    string historyID = null;
    string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";

    // Prepare report parameter.
    ParameterValue[] parameters = new ParameterValue[3];
    parameters[0] = new ParameterValue();
    parameters[0].Name = "InvoiceID";
    parameters[0].Value = "2";

    DataSourceCredentials[] credentials = null;
    string showHideToggle = null;
    string encoding;
    string mimeType;
    string extension;
    Warning[] warnings = null;
    ParameterValue[] reportHistoryParameters = null;
    string[] streamIDs = null;

    ExecutionInfo execInfo = new ExecutionInfo();
    ExecutionHeader execHeader = new ExecutionHeader();

    rs.ExecutionHeaderValue = execHeader;

    execInfo = rs.LoadReport(reportPath, historyID);

    rs.SetExecutionParameters(parameters, "en-us");
    String SessionId = rs.ExecutionHeaderValue.ExecutionID;

    Console.WriteLine("SessionID: {0}", rs.ExecutionHeaderValue.ExecutionID);


    try
    {
        result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

        execInfo = rs.GetExecutionInfo();

        Console.WriteLine("Execution date and time: {0}", execInfo.ExecutionDateTime);


    }
    catch (SoapException e)
    {
        Console.WriteLine(e.Detail.OuterXml);
    }
    // Write the contents of the report to an MHTML file.
    try
    {
        FileStream stream = File.Create("report1one.pdf", result.Length);
        Console.WriteLine("File created.");
        stream.Write(result, 0, result.Length);
        Console.WriteLine("Result written to the file.");
        stream.Close();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }

2 个答案:

答案 0 :(得分:5)

您正在使用的Web服务URL(ReportService2012)用于管理报表服务器对象。

如果您需要呈现报告,则应使用ReportExecution2005网络服务。

要开始使用,您应该查看Render方法。

要指定凭据,您可以添加以下行(我使用链接中使用的相同变量名称:RS2005):

RS2005.Credentials = new System.Net.NetworkCredential("username", "password", "domain");

修改

当您的应用程序尝试使用您的Web应用程序保存文件时,会发生访问被拒绝错误,因此您应该使用绝对路径或使用Server.MapPath解析它

答案 1 :(得分:0)

我建议在Crafted For Everyone找到一个非常简单的实现。作者演示了如何将服务引用添加到SSRS服务器,然后提供了在第一次尝试中对我有用的示例代码。

它将报告保存到本地文件,但是很容易通过电子邮件发送报告(样本中未包含。