SSRS2008:LocalReport导出为HTML /片段

时间:2010-01-27 10:37:26

标签: ssrs-2008

我需要将本地RDL报告导出为HTML,最好是HTML片段。 2005年它没有得到官方支持,但有一个trick。在SSRS2008中,他们似乎放弃了这种支持(使用反射枚举时支持的扩展中没有HTML扩展)并使用RPL而不是二进制格式,我怀疑有人会乐意解析。实际上它根本不是关于HTML的。

现在,有没有办法使用SSRS2008本地报告呈现HTML?

请注意,我使用的是VS2008,但是使用了从VS2010 Beta 2 reportviewer安装的报告程序集。

3 个答案:

答案 0 :(得分:2)

我找到了办法,但不是很好。 将报告导出为mhtml(SSRS2008支持) 然后使用System.Windows.Forms.WebBrowser渲染mhtml。 在wb.DocumentText属性中将是完整的html页面。

这不是很好,因为你需要一个文件(作为WebBrowser的url)。 而且,如果我在ASP.NET应用程序中使用WebBrowser,我需要使用STA ApartmentState在另一个线程中处理它。

答案 1 :(得分:0)

寻找同样的事情。我想我想我们可以尝试以某种方式使用反射来获取ReportViewer的渲染输出?

我可能会稍微谈谈它,看看我能想出什么。

答案 2 :(得分:0)

如果你能得到mht,你可以用MIMER提取它的内容。

这里有一个nu-get包(MIMER需要.NET Framework 3.5):
https://www.nuget.org/packages/MIMER/

using System;
using System.Collections.Generic;
using System.Windows.Forms;


using MIMER;


namespace MimerTest
{


    // https://github.com/smithimage/MIMER/blob/master/MIMERTests/MHT/MhtTests.cs
    // https://github.com/smithimage/MIMER/
    static class Program
    {



        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (false)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }


            System.IO.Stream m_Stream;
            string path = @"d:\USERNAME\documents\visual studio 2013\Projects\MimerTest\MimerTest\whatismht.mht";

            System.IO.FileInfo finf = new System.IO.FileInfo(path);
            m_Stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);

            var reader = new MIMER.RFC2045.MailReader();
            MIMER.IEndCriteriaStrategy endofmessage = new MIMER.RFC2045.BasicEndOfMessageStrategy();
            var message = reader.ReadMimeMessage(ref m_Stream, endofmessage);

            System.Collections.Generic.IDictionary<string,string> allContents = message.Body;

            string strFile = allContents["text/html"];


            foreach (System.Collections.Generic.KeyValuePair<string,string> kvp in allContents)
            {
                System.Console.WriteLine(kvp.Key);
                System.Console.WriteLine(kvp.Value);
            }



            System.Console.WriteLine(" --- Press any key to continue --- ");
            System.Console.ReadKey();
        }
    }
}

在2005 ReportViewer中,您可以通过反射启用HTML:

private static void EnableFormat(ReportViewer viewer, string formatName)
{
     const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;

     FieldInfo m_previewService = viewer.LocalReport.GetType().GetField
     (
         "m_previewService",
         Flags
     );

     MethodInfo ListRenderingExtensions = m_previewService.FieldType.GetMethod
     (
         "ListRenderingExtensions",
         Flags
     );

     object previewServiceInstance = m_previewService.GetValue(viewer.LocalReport);

     IList extensions = ListRenderingExtensions.Invoke(previewServiceInstance, null) as IList;

     PropertyInfo name = extensions[0].GetType().GetProperty("Name", Flags);

     foreach (object extension in extensions)
     {
         if (string.Compare(name.GetValue(extension, null).ToString(), formatName, true) == 0)
         {
             FieldInfo m_isVisible = extension.GetType().GetField("m_isVisible", BindingFlags.NonPublic | BindingFlags.Instance);
             FieldInfo m_isExposedExternally = extension.GetType().GetField("m_isExposedExternally", BindingFlags.NonPublic | BindingFlags.Instance);
             m_isVisible.SetValue(extension, true);
             m_isExposedExternally.SetValue(extension, true);
             break;
         }
     }
 }

用法:

var Viewer = new Microsoft.Reporting.WebForms.ReportViewer();
EnableFormat(Viewer, "HTML4.0");

您可能也会觉得这很有趣:

http://www.codeproject.com/Articles/23966/Report-Viewer-generate-reports-MS-Word-formats