5

我无法打开呈现为 xlsx 文件的 SSRS 报告,该文件是通过从 SSIS 脚本任务调用 Reporting Services Web 服务 ReportExecution2005.asmx?wsdl 生成的。但是我可以打开由相同方法生成的 xls 文件。

有人可以告诉我渲染可用的 xlsx 文件需要做什么吗?

我正在尝试使用脚本任务从 SSIS 运行 Reporting Services 报告。我需要将报告呈现为 Excel xlsx 文件。如果我使用 .xls 扩展名,我的代码可以工作,我的意思是它确实会生成一个可以在 Excel 中打开的 xls 文件。但是,如果我将文件扩展名更改为 xlsx,我会得到一个无法打开的文件,并产生以下错误。“Excel 无法打开文件,因为文件格式或文件扩展名无效。验证文件…………..”</p>

在我使用的代码中

MimeType = “application/vnd.ms-excel” for the xls file

MimeType = “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”

对于 xlsx 文件

我用来运行报告的 Web 服务是 ReportExecution2005.asmx?wsdl(我认为它是正确的吗?)

我的 SSIS 脚本任务代码如下,

        var rsClient = new RSExec.ReportExecutionServiceSoapClient();

        rsClient.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("username", "password");

        rsClient.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

        byte[] result = null;

        string reportPath = "filepath/filename";  
        string format = "EXCEL"; 
        string historyID = null;
        string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";

        string encoding = String.Empty; //"";

        string mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // Excel2010


        //string mimeType = "application/vnd.ms-excel"; // EXCEL

        string extension = "";
        Warning[] warnings = null;
        string[] streamIDs = null;
        ParameterValue[] parameters = new ParameterValue[1];
        parameters[0] = new ParameterValue();
        parameters[0].Name = "ReportDate";
        parameters[0].Value = "12/11/2013";


        RSExec.ExecutionInfo execInfo = new RSExec.ExecutionInfo();
        RSExec.TrustedUserHeader trustedUH = new TrustedUserHeader();
        RSExec.ExecutionHeader execHeader = new RSExec.ExecutionHeader();
        RSExec.ServerInfoHeader serverInfo = new ServerInfoHeader();

        execHeader = rsClient.LoadReport(trustedUH, reportPath, historyID, out serverInfo, out execInfo);

        rsClient.SetExecutionParameters(execHeader, trustedUH, parameters, "en-us", out execInfo);



        rsClient.Render(execHeader, trustedUH, format, devInfo, out result, out extension, out encoding, out mimeType, out warnings, out streamIDs);

        string filename = @"filepath\filename.xlsx";

        FileStream stream = File.OpenWrite(filename);
        stream.Write(result, 0, result.Length);
        stream.Close();

        Dts.TaskResult = (int)ScriptResults.Success;

为了让它作为部署包运行,进行了以下修改由于部署包无法引用配置文件,Web 服务的绑定已在脚本任务中编码

using System;
using System.IO;
using ST_ece9b5f6ee774a84a76c32da60affdef.RSExec;

namespace ST_ece9b5f6ee774a84a76c32da60affdef
{


//using System;
using System.Xml;
using System.Text;
using System.Data;
using System.Web;
using Microsoft.SqlServer.Dts.Tasks;
using Microsoft.SqlServer.Dts.Runtime;
//using System.IO;
using System.ServiceModel;
using System.ServiceModel.Security;
using System.Windows.Forms;

/// <summary>
/// ScriptMain is the entry point class of the script.  Do not change the name, attributes,
/// or parent of this class.
/// </summary>
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{

    public void Main()
    {

        // set Report Name 
        string ReportName = "My Report";


        // all other variables are set from Package Variables
        string ReportDate = Dts.Variables["User::PreviousBusinessDate"].Value.ToString();
        string reportPath = Dts.Variables["User::ReportServerFolder"].Value.ToString() + ReportName;
        string filename = Dts.Variables["User::DestinationFolder"].Value.ToString() + ReportName + "_" + DateTime.Now.ToString("yyyy-MM-dd_hhmmss") + ".xlsx";


        byte[] result = null;
        string format = "EXCELOPENXML"; // "EXCEL"; //"PDF"; 
        string historyID = null;
        string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
        string encoding = String.Empty; //"";
        string mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // Excel2010


        string extension = "";
        Warning[] warnings = null;
        string[] streamIDs = null;
        ParameterValue[] parameters = new ParameterValue[1];
        parameters[0] = new ParameterValue();
        parameters[0].Name = "ReportDate";
        parameters[0].Value = ReportDate;    //"12/11/2013";


        ExecutionInfo execInfo = new ExecutionInfo();
        TrustedUserHeader trustedUH = new TrustedUserHeader();
        ExecutionHeader execHeader = new ExecutionHeader();
        ServerInfoHeader serverInfo = new ServerInfoHeader();

        ReportExecutionServiceSoapClient serviceClient = this.GetServiceClient();

        execHeader = serviceClient.LoadReport(trustedUH, reportPath, historyID, out serverInfo, out execInfo);
        serviceClient.SetExecutionParameters(execHeader, trustedUH, parameters, "en-us", out execInfo);
        serviceClient.Render(execHeader, trustedUH, format, devInfo, out result, out extension, out encoding, out mimeType, out warnings, out streamIDs);


        FileStream stream = File.OpenWrite(filename);
        stream.Write(result, 0, result.Length);
        stream.Close();

        Dts.TaskResult = (int)ScriptResults.Success;
    }

    private ReportExecutionServiceSoapClient GetServiceClient()
    {
        BasicHttpBinding binding = this.GetBinding();
        var address = new EndpointAddress("http://myReportServer/ReportServer/ReportExecution2005.asmx");
        var serviceClient = new ReportExecutionServiceSoapClient(binding, address);
        serviceClient.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("username", "password");
        serviceClient.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        return serviceClient;
    }

    private BasicHttpBinding GetBinding()
    {
        var readerQuotas = new XmlDictionaryReaderQuotas()
        {
            MaxDepth = 32,
            MaxStringContentLength = 8192,
            MaxArrayLength = 16384,
            MaxBytesPerRead = 4096,
            MaxNameTableCharCount = 16384
        };

        var transport = new HttpTransportSecurity()
        {
            ClientCredentialType = HttpClientCredentialType.Ntlm,
            ProxyCredentialType = HttpProxyCredentialType.None,
            Realm = string.Empty
        };

        var message = new BasicHttpMessageSecurity()
        {
            ClientCredentialType = BasicHttpMessageCredentialType.UserName,
            AlgorithmSuite = SecurityAlgorithmSuite.Default
        };

        var security = new BasicHttpSecurity()
        {
            Mode = BasicHttpSecurityMode.TransportCredentialOnly,
            Transport = transport,
            Message = message
        };

        var binding = new BasicHttpBinding()
        {
            Name = "ReportExecutionServiceSoap",
            CloseTimeout = TimeSpan.FromMinutes(1),
            OpenTimeout = TimeSpan.FromMinutes(1),
            ReceiveTimeout = TimeSpan.FromMinutes(10),
            SendTimeout = TimeSpan.FromMinutes(1),
            AllowCookies = false,
            BypassProxyOnLocal = false,
            HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
            MaxBufferSize = 524288,
            MaxBufferPoolSize = 524288,
            MaxReceivedMessageSize = 524288,
            MessageEncoding = WSMessageEncoding.Text,
            TextEncoding = Encoding.UTF8,
            TransferMode = TransferMode.Buffered,
            UseDefaultWebProxy = true,
            ReaderQuotas = readerQuotas,
            Security = security
        };

        return binding;
    }


}

}

4

2 回答 2

7

您不能互换使用 XLS 和 XLSX - 它们是完全不同的格式。

XLS 是基于二进制的格式,而 XLSX 是基于 XML 模式的格式——它们将是完全不同的文件类型。您可以自己测试 - 在 Excel 中创建一个 XLS 文件,将其重命名为 XLSX,当您尝试打开它时会出错。

SSRSEXCEL格式只能保存为 XLS 文件。

SSRS 2012 可以导出到 XLSX,但您需要使用EXCELOPENXML格式,而不是EXCEL.

于 2013-11-13T15:47:45.117 回答
0

使用 EXCELOPENXML 对我有用。谢谢伊恩。

同样作为贡献,即使您指定了 :string filename = @"filepath\filename.xlsx 并不意味着 SSRS 将以 .xlsx 格式呈现报告。最终呈现的格式在 render 方法的第三个输出参数中指定。( extension) eg Render("EXCEL",//Renderformat, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs );

于 2014-07-17T10:54:05.827 回答