使用ReportService2010.asmx在SharePoint中以编程方式导出SSRS报告

8

我需要以编程的方式将ssrs报表导出到Excel,添加服务引用到

http:/siteurl/_vti_bin/ReportServer/ReportService2010.asmx

http:/siteurl/_vti_bin/ReportServer/ReportExecution2005.asmx

有人可以提供一个可行的博客吗?

1个回答

11

目前我的工作是使用VS 2012 .NET 4.5进行报告自动化生成PDF报告。

A. 为了方便编译,编写自己的代理类比每次引用Web服务更容易,因为您可能会忘记服务名称。

从Visual Studio命令提示符中:

    wsdl /language:CS /n:"Microsoft.SqlServer.ReportingServices2010" http://<Server Name>/reportserver/reportservice2010.asmx?wsdl

参考:http://msdn.microsoft.com/en-us/library/ms155134(v=sql.105).aspx (如果您只需要呈现报表,则只需要ReportExecution2005,如果您想获取信息和执行报表,则需要ReportExecution2005和ReportService2010。)

B. 创建代理类后,将其放入一个库项目中以进行重用。可以建立一些包装器类来完成编写工作,并在配置文件中提供一些服务器引用,以便您可以在多个环境中引用。

C. 编写一些代码引用该库,并在C#中构建第一份报告:

    using System;
    using System.IO;
    using System.Web.Services.Protocols;
    using myNamespace.MyReferenceName;  // YOUR PROXY PROJECT 

    class Sample
    {
    static void Main(string[] args)
    {
        ReportExecutionService rs = new ReportExecutionService();
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
        rs.Url = "http://myserver/reportserver/ReportExecution2005.asmx";

        // Render arguments
        byte[] result = null;
        string reportPath = "/AdventureWorks Sample Reports/Employee Sales Summary";
        string format = "MHTML";
        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 = "EmpID";
        parameters[0].Value = "288";
        parameters[1] = new ParameterValue();
        parameters[1].Name = "ReportMonth";
        parameters[1].Value = "6"; // June
        parameters[2] = new ParameterValue();
        parameters[2].Name = "ReportYear";
        parameters[2].Value = "2004";

        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("report.mht", 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);
        }

    }
    }

摘自此处:http://msdn.microsoft.com/en-us/library/reportexecution2005.reportexecutionservice.render(v=sql.105).aspx

D.(可选):您可能希望处理SSRS托管服务器上Web服务的刷新。默认情况下,它每12小时循环一次,因此使第一个报告在那之后变得缓慢。您可以通过简单地调用位于 http://(servername)/ReportServer 的服务端点来刷新这些服务,大约每10小时进行一次。我使用了一个名为Visual Cron的工具来设置自动任务,您也可以尝试更改SSRS服务配置、创建自己的保持活动状态的服务等等。基本上,您只需要更改设置或与其通信以保持其开放状态。


如何在C#中以编程方式使用数据源或查询?还是只能在RDL文件中使用? - Kiquenet
这与上面的问题没有任何实际关系。但我认为我回答了一个类似于你在这里提出的问题:http://stackoverflow.com/questions/16817911/get-data-from-ssrs-dataset/16821933#16821933 - djangojazz

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