65.9K
CodeProject 正在变化。 阅读更多。
Home

用于 DataSets 的免费 HTML 报表生成器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.61/5 (15投票s)

2004年5月30日

CPOL

3分钟阅读

viewsIcon

105052

downloadIcon

3774

有很多报告工具,价格、功能和学习曲线各不相同。我想要一个 ASAP 工具(尽可能简单:-))来生成 HTML 输出并查看它们,重点是动态创建能力。我首先为 ADO 数据集制作了一个报告器。

Sample screenshot

引言

有很多报告工具,它们的价格、功能和学习曲线各不相同。我想要一个 ASAP 工具(尽可能简单:-))来生成 HTML 输出并查看它们,重点是动态创建能力。一旦我们有了 HTML 预览器,就可以使用许多 PDF 转换器来提供最终的专业外观。我个人推荐 PDF 虚拟打印机,因为它们易于使用。

我首先是为 ADO DataSet 创建一个报告器。我使用了带有 .NET 的 XSL 和 XPath 功能的 XSLT,然后就开始了。

总体思路

设计非常简单。我们获取 XML 和预先创建的 XSLT,并将其转换为 HTML。

我决定了以下功能线

  1. Validate() - 确保这是一个格式良好的模式,具有连续的数据。
  2. PreTransformationEdits() - 如果我们需要在转换之前编辑 XML。
  3. Transform() - 将 XML 和 XSLT 合并到一起,得到一个令人满意的 HTML。
  4. PostTransformationEdits() - 用于最后时刻的 HTML 编辑。
  5. 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();

未来版本

这是第一个版本,任何未来版本都很大程度上取决于我紧张的日程安排。

欢迎您向我发送建议等,请尽量减少它们的繁琐程度:-)(即代码片段,而不是完整的附件)。

祝你好运。

© . All rights reserved.