我需要以编程的方式将ssrs报表导出到Excel,添加服务引用到
http:/siteurl/_vti_bin/ReportServer/ReportService2010.asmx
http:/siteurl/_vti_bin/ReportServer/ReportExecution2005.asmx
有人可以提供一个可行的博客吗?
我需要以编程的方式将ssrs报表导出到Excel,添加服务引用到
http:/siteurl/_vti_bin/ReportServer/ReportService2010.asmx
http:/siteurl/_vti_bin/ReportServer/ReportExecution2005.asmx
有人可以提供一个可行的博客吗?
目前我的工作是使用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);
}
}
}
D.(可选):您可能希望处理SSRS托管服务器上Web服务的刷新。默认情况下,它每12小时循环一次,因此使第一个报告在那之后变得缓慢。您可以通过简单地调用位于 http://(servername)/ReportServer 的服务端点来刷新这些服务,大约每10小时进行一次。我使用了一个名为Visual Cron的工具来设置自动任务,您也可以尝试更改SSRS服务配置、创建自己的保持活动状态的服务等等。基本上,您只需要更改设置或与其通信以保持其开放状态。