用于 DataSets 的免费 HTML 报表生成器
有很多报告工具,价格、功能和学习曲线各不相同。我想要一个 ASAP 工具(尽可能简单:-))来生成 HTML 输出并查看它们,重点是动态创建能力。我首先为 ADO 数据集制作了一个报告器。
引言
有很多报告工具,它们的价格、功能和学习曲线各不相同。我想要一个 ASAP 工具(尽可能简单:-))来生成 HTML 输出并查看它们,重点是动态创建能力。一旦我们有了 HTML 预览器,就可以使用许多 PDF 转换器来提供最终的专业外观。我个人推荐 PDF 虚拟打印机,因为它们易于使用。
我首先是为 ADO DataSet
创建一个报告器。我使用了带有 .NET 的 XSL 和 XPath 功能的 XSLT,然后就开始了。
总体思路
设计非常简单。我们获取 XML 和预先创建的 XSLT,并将其转换为 HTML。
我决定了以下功能线
Validate()
- 确保这是一个格式良好的模式,具有连续的数据。PreTransformationEdits()
- 如果我们需要在转换之前编辑 XML。Transform()
- 将 XML 和 XSLT 合并到一起,得到一个令人满意的 HTML。PostTransformationEdits()
- 用于最后时刻的 HTML 编辑。ShowHtml()
- 实际预览。
细节
DataSet
作为流提供,首先验证它是否是正确的 DataSet
XML 模式。我没有花太多时间在其他验证上,因为 DataSet
通常格式良好
//each schema must have the table element.
XmlNodeList Tables =
XmlData.SelectNodes("/*/xs:schema/xs:element/xs:complexType/xs:choice/xs:element",
m_NamespaceMgr);
if ( Tables.Count == 0 )
{
throw new Exception( C_ERR_NO_TABLES );
}
现在,我们运行预转换编辑。我们必须将动态设置的属性(例如字体颜色等)安装到 XSLT 的样式标记部分中,才能影响 HTML。这是在 AmendCSSAttributes()
中完成的。
接下来,我们必须计算每一列现在应具有的正确宽度,以便适合 A4,这是在 ParseColumnWidths()
函数中完成的。
现在,实际的转换:我们将输入 XML 与嵌入在项目中的 XSLT 资源组合到生成的 HTML 中。
//loading stylesheet into an XslTransform class
// Get the assembly that contains the resource
Assembly myAssembly = Assembly.GetAssembly( this.GetType() );
// Get the resource stream containing the XSLTStream
XSLTStream = myAssembly.GetManifestResourceStream( C_TRANSLATOR_RESOURCE_NAME );
XPathDocument styleSheet = new XPathDocument( XSLTStream );
XslTransform XslTransformer = new XslTransform();
XslTransformer.Load( styleSheet,null,null );
//actual transformation
XslTransformer.Transform( XmlData,null,OutputStream,null );
//roll stream pointer to beginning.
OutputStream.Seek( 0 ,SeekOrigin.Begin );
下一个阶段是后转换编辑,我定义了它,但现在实际上不需要它。
最后,我们使用嵌入式 IExplorer 控件(AxSHDocVw.AxWebBrowser
控件)显示结果。为此,我们首先必须将结果保存为临时 HTML 文件。因此,我将其生成到临时 Internet 缓存文件夹中,并使用新的 GUID 命名它,使其成为唯一的。
期待什么/不期待什么
- 该工具了解打印机的使用方法(感谢亲爱的 Chris Sells 和他的伟大著作 - C# 中的 Windows 窗体编程)。
- 您可以要求它扩展到 A4 之外或直接挤入 A4。
- 您可以动态决定表头和行线的字体颜色和背景颜色。
- 您可以决定显示哪些滚动条(宽度/高度/两者/无)。
- 您可以设置所需的任何行高和字体大小。
- 您可以为预览器屏幕选择自己的应用程序一致的图标和标题。
缺少什么?
- 更多 HTML 表格样式。
- 分页符。尽管 XSLT 代码记录了应该如何完成,但这项工作仍然存在。
- HTML 中的标题/主题/摘要。
- 直接接受
DataSet
而不是流 - 这是一个非常简单的操作,即将添加。
编写此包与预定义它的正确范围有很大关系。您可以轻松地扩大此库的需求,最直接的要求是使该工具支持更多报告类型(即,不仅是表格)。
快速示例
//Preparation
//using microsoft's data access application block to generate a dataset.
dsQueryResult =
SqlHelper.ExecuteDataSet(Connstr,
CommandType.Text,"Select * from suppliers" );
//save it to a file
dsQueryResult.WriteXml( @"C:\temp\result.xml",XmlWriteMode.WriteSchema );
//Now open as stream
FileStream read = new FileStream( @"c:\temp\result.xml",FileMode.Open );
//The actual usage
//create the object
ReportViewer rpView = new ReportViewer();
//Set up some attributes
rpView.CellScrollBehaviour = ReportViewer.CellScrollBars.Horizontal;
rpView.RowColor = Color.Green;
rpView.AppTitle = "My demo view";
rpView.StretchLayout = false;
//Show the result
rpView.ShowReport( read );
//Cleanup
read.Close();
dsQueryResult.Dispose();
未来版本
这是第一个版本,任何未来版本都很大程度上取决于我紧张的日程安排。
欢迎您向我发送建议等,请尽量减少它们的繁琐程度:-)(即代码片段,而不是完整的附件)。
祝你好运。