我需要将本地RDL报告导出为HTML,最好是HTML片段。 2005年它没有得到官方支持,但有一个trick。在SSRS2008中,他们似乎放弃了这种支持(使用反射枚举时支持的扩展中没有HTML扩展)并使用RPL而不是二进制格式,我怀疑有人会乐意解析。实际上它根本不是关于HTML的。
现在,有没有办法使用SSRS2008本地报告呈现HTML?
请注意,我使用的是VS2008,但是使用了从VS2010 Beta 2 reportviewer安装的报告程序集。
答案 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