0

我有一个用 C# 编写的 Web 应用程序,我需要能够在不使用报表查看器控件的情况下SSRS在 aspx 页面上呈现报表。

因为 div 标签内的 HTML 将是完美的。我通过引用 将应用程序附加到我的SSRS实例。ReportingService2010

我在网上找到了一些示例,但适用于ReportingServices2005并且无法将它们移植过来。

我怎样才能做到这一点?

4

3 回答 3

6

我从大约一年前完成的一个项目中提取了这个。

几个关键点:

  • 您需要将凭据传递给报表服务器。
  • 您需要创建一个图像路径,以便报告中的任何图像都在 html Report/GraphFiles/ 中呈现和显示“这应该与您的应用程序 url 相关”
  • 如果您的报告有任何参数,您将需要添加它们。
  • 你肯定需要 tweek 代码才能让它运行。

它使用 ReportExecutionService 参考,您将不得不使用它,但具体细节应该都在这里。

我真的很想花时间清理一下,但我没有时间抱歉,我希望它有所帮助

class RenderReport
    {

        public struct ReportServerCreds
            {
                public string UserName { get; set; }
                public string Password { get; set; }
                public string Domain { get; set; }

            }

            public ReportServerCreds GetReportCreds()
            {

                ReportServerCreds rsc = new ReportServerCreds();
                rsc.UserName = ConfigurationManager.AppSettings["reportserveruser"].ToString();
                rsc.Password = ConfigurationManager.AppSettings["reportserverpassword"].ToString();
                rsc.Domain = ConfigurationManager.AppSettings["reportserverdomain"].ToString();

                return rsc;
            }

           public enum SSRSExportType
            { 
                HTML,PDF
            }

            public string RenderReport(string reportpath,SSRSExportType ExportType)
            {
                using (ReportExecutionService.ReportExecutionServiceSoapClient res = new   ReportExecutionService.ReportExecutionServiceSoapClient("ReportExecutionServiceSoap"))
                {

                    ReportExecutionService.ExecutionHeader ExecutionHeader = new ReportExecutionService.ExecutionHeader();
                    ReportExecutionService.TrustedUserHeader TrusteduserHeader = new ReportExecutionService.TrustedUserHeader();

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

                    ReportServerCreds rsc = GetReportCreds();
                    res.ClientCredentials.Windows.ClientCredential.Domain = rsc.Domain;
                    res.ClientCredentials.Windows.ClientCredential.UserName = rsc.UserName;
                    res.ClientCredentials.Windows.ClientCredential.Password = rsc.Password;


                    res.Open();
                    ReportExecutionService.ExecutionInfo ei = new ReportExecutionService.ExecutionInfo();

                    string format =null;
                    string deviceinfo =null;
                    string mimetype = null;

                    if (ExportType.ToString().ToLower() == "html")
                    {
                        format = "HTML4.0";
                        deviceinfo = @"<DeviceInfo><StreamRoot>/</StreamRoot><HTMLFragment>True</HTMLFragment></DeviceInfo>";
                    }
                    else if (ExportType.ToString().ToLower() == "pdf")
                    {
                        format = "PDF";
                        mimetype = "";
                    }


                    byte[] results = null;
                    string extension = null;
                    string Encoding = null;
                    ReportExecutionService.Warning[] warnings;
                    string[] streamids = null;
                    string historyid = null;
                    ReportExecutionService.ExecutionHeader Eheader;
                    ReportExecutionService.ServerInfoHeader serverinfoheader;
                    ReportExecutionService.ExecutionInfo executioninfo;



                    // Get available parameters from specified report.
                    ParameterValue[] paramvalues = null;
                    DataSourceCredentials[] dscreds = null;
                    ReportParameter[] rparams = null;

                    using (ReportService.ReportingService2005SoapClient lrs = new ReportService.ReportingService2005SoapClient("ReportingService2005Soap"))
                    {


                        lrs.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
                        lrs.ClientCredentials.Windows.ClientCredential.Domain = rsc.Domain;
                        lrs.ClientCredentials.Windows.ClientCredential.UserName = rsc.UserName;
                        lrs.ClientCredentials.Windows.ClientCredential.Password = rsc.Password;


                        lrs.GetReportParameters(reportpath,historyid,false,paramvalues,dscreds,out rparams);

                    }



                    // Set report parameters here
                    //List<ReportExecutionService.ParameterValue> parametervalues = new List<ReportExecutionService.ParameterValue>();

                    //string enumber = Session["ENumber"] as string;
                    //parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "ENumber", Value = enumber });

                    //if (date != null)
                    //{
                    //    DateTime dt = DateTime.Today;
                        //parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "AttendanceDate", Value = dt.ToString("MM/dd/yyyy")});
                    //}

                    //if (ContainsParameter(rparams, "DEEWRID"))
                    //{
                        //parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "DEEWRID", Value = deewrid });
                    //}

                    //if (ContainsParameter(rparams, "BaseHostURL"))
                    //{
//                        parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "BaseHostURL", Value = string.Concat("http://", Request.Url.Authority) });
                    //}


                    //parametervalues.Add(new ReportExecutionService.ParameterValue() {Name="AttendanceDate",Value=null });
                    //parametervalues.Add(new ReportExecutionService.ParameterValue() { Name = "ENumber", Value = "E1013" });



                    try
                    {

                        Eheader = res.LoadReport(TrusteduserHeader, reportpath, historyid, out serverinfoheader, out executioninfo);
                        serverinfoheader = res.SetExecutionParameters(Eheader, TrusteduserHeader, parametervalues.ToArray(), null, out executioninfo);
                        res.Render(Eheader, TrusteduserHeader, format, deviceinfo, out results, out extension, out mimetype, out Encoding, out warnings, out streamids);

                        string exportfilename = string.Concat(enumber, reportpath);

                        if (ExportType.ToString().ToLower() == "html")
                        {
                            //write html
                            string html = string.Empty;
                            html = System.Text.Encoding.Default.GetString(results);

                            html = GetReportImages(res, Eheader, TrusteduserHeader, format, streamids, html);

                            return html;
                        }
                        else if (ExportType.ToString().ToLower() == "pdf")
                        {
                            //write to pdf


                            Response.Buffer = true;
                            Response.Clear();
                            Response.ContentType = mimetype;



                            //Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.pdf", exportfilename));
                            Response.BinaryWrite(results);
                            Response.Flush();
                            Response.End();

                        }


                    }
                    catch (Exception e)
                    {
                        Response.Write(e.Message);
                    }
                }

            }


            string GetReportImages(ReportExecutionService.ReportExecutionServiceSoapClient res, 
                                   ReportExecutionService.ExecutionHeader EHeader,
                                    ReportExecutionService.TrustedUserHeader tuh,
                                   string reportFormat, string[] streamIDs, string html)
            {
                if (reportFormat.Equals("HTML4.0") && streamIDs.Length > 0)
                {
                    string devInfo;
                    string mimeType;
                    string Encoding;
                    int startIndex;
                    int endIndex;
                    string fileExtension = ".jpg";

                    string SessionId;

                    Byte[] image;

                    foreach (string streamId in streamIDs)
                    {
                        SessionId = Guid.NewGuid().ToString().Replace("}", "").Replace("{", "").Replace("-", "");
                        //startIndex = html.IndexOf(streamId);
                        //endIndex = startIndex + streamId.Length;

                        string reportreplacementname = string.Concat(streamId, "_", SessionId, fileExtension);
                        html = html.Replace(streamId, string.Concat(@"Report\GraphFiles\", reportreplacementname));


                        //html = html.Insert(endIndex, fileExtension);
                        //html = html.Insert(startIndex, @"Report/GraphFiles/" + SessionId + "_");

                        devInfo = "";
                        //Image = res.RenderStream(reportFormat, streamId, devInfo, out encoding, out mimeType);
                        res.RenderStream(EHeader,tuh, reportFormat, streamId, devInfo, out image , out Encoding, out mimeType);



                        System.IO.FileStream stream = System.IO.File.OpenWrite(HttpContext.Current.Request.PhysicalApplicationPath + "Report\\GraphFiles\\" + reportreplacementname);
                        stream.Write(image, 0, image.Length);
                        stream.Close();
                        mimeType = "text/html";
                    }
                }

                return html;
            }

            bool ContainsParameter(ReportParameter[] parameters, string paramname)
            {
                    if(parameters.Where(i=>i.Name.Contains(paramname)).Count() != 0)
                    {
                        return true;
                    }
                    return false;
                }
    }

执行:

第一个参数是报告在服务器上的位置。第二个是 SSRSExportType 枚举

RenderReport("ReportPathOnServer",SSRSExportType.HTML);
于 2013-11-19T05:40:44.000 回答
1

如果您只是尝试显示报表的 HTML 呈现,并且希望它看起来像应用程序的本机对象,没有任何参数或工具栏,那么您可以直接调用报表的 URL 并包含 "&rc:Toolbar=false “在网址中。这将隐藏报表查看器控件的工具栏。此方法在URL 访问参数参考 msdn 文章中进行了描述。不完全是您要求的,但它可能会达到目的。

如果您将结果嵌入到现有 HTML 文档中,下面是一个省略 HTML 和 Body 部分的示例调用:

http://ServerName/ReportServer?%2fSome+Folder%2fSome+Report+Name&rs:Command=Render&rc:Toolbar=false&rc:HTMLFragment=true
于 2013-11-13T20:17:29.467 回答
0

绝对是一个老问题,但如果你使用的是 ASP.NET MVC,你可以试试这个开源解决方案。它使用 HTML 帮助程序并.aspx在 iframe 中呈现页面。该 repo 有一个服务器端、本地渲染和匿名示例。

于 2019-06-15T15:01:05.223 回答