使用 SQL 查询生成动态报告






4.32/5 (25投票s)
2005年8月25日
2分钟阅读

205729

4440
使用 PrintDocument 组件和 SQL 查询的动态报表。
引言
Microsoft Visual Studio .NET 提供了 Crystal Reports 用于报表打印,并将 `DataReport` 组件(Visual Studio 6)从 .NET 中移除。 虽然 Crystal Reports 是一个不错的报表创建器,但有时当我们想要创建动态报表,例如列出某些内容或进行数据汇总时,它并不是那么合适。 Crystal Reports 可以用于动态报表,但它具有固定的列类型集和最大列数。
所以我使用了 `.NET` 基础库 `System.Drawing.Printing` 命名空间中的 `PrintDocument` 组件。 `PrintDocument` 是一个类似普通纸张的组件。 您可以在其上绘制或打印任何内容。 通常,您必须设置对象坐标和其他属性,就像使用笔在纸上书写一样。 但对于此代码,您只需使用 SQL 查询或数据集!
使用代码
将一个窗体和一个 `PrintDocument` 组件添加到项目中。 并使用一个 `DataSet`,并通过严格的格式指定第一个表 ( `Table(0)` ) 的列(每 1 个报表列 1 组)
- 第 1 列 -> 列名。
- 第 2 列 -> 纸张上的起始位置,我设置了所有宽度都在 0-99 之间。
- 第 3 列 -> 纸张上的结束位置,我设置了所有宽度都在 0-99 之间。
- 第 4 列 -> 对齐方式(L-左对齐,R-右对齐,C-居中)。
- 第 5 列 -> 是否在此列中进行汇总 (Y/N)。
- 第 6 列 -> 显示格式(例如 #,##0.00)。
- 第 7 列 -> 是否换行? 从 1 开始。
- 第 8 列 -> 数据列。
请看示例,很容易理解。
我们可以设置 `PageSetDlg` 和 `prnSetDlg` 对象的属性以进行打印选项设置。 我使用 Form 组件,并将 `PrintDocument`、`PrintPreviewDialog`、`PageSetupDialog` 和 `PrintDialog` 组件放在上面。 然后,我们可以使用这些进行直接打印或使用打印对话框。 我们可以设置这些对象的属性以进行特定的打印选项设置,例如将页面方向设置为横向等。
'-------- Example use, If you haved data in
' dataset already. --------------
'--- We can set properties of PageSetDlg
' and prnSetDlg object for print option
'frmDynamicPrint.PageSetDlg.PageSettings.Landscape = True
'---If it has sum column is this report,
' we have to set hasSum flag to true.
frmDynamicPrint.hasSum = True
'---Initialization
frmDynamicPrint.FontName = "Tahoma"
frmDynamicPrint.FontSize = 12
frmDynamicPrint.FontSizeHead = 16
frmDynamicPrint.FontSizeHead2 = 14
frmDynamicPrint.LineHeight = 1
frmDynamicPrint.SkipLinePerRecord = 1
'---Call InitPrint for inital some properties,
' you can modify it.
frmDynamicPrint.InitPrint()
frmDynamicPrint.HeadFirstString = _
"Report for Product Order Value Summary"
frmDynamicPrint.HeadSecondString = "Test Report"
frmDynamicPrint.DateString = Now.ToString
frmDynamicPrint.PrintPreview()
frmDynamicPrint.Dispose()
关注点
稍后我将开发一个 HTML 报告,或者添加一个将报告导出为另一种格式的功能。
历史
- 2005 年 11 月 27 日 - 修复了示例中设置页码的一个小错误。
- 2005 年 11 月 24 日 - 修复了查询循环和汇总方法中的一个大错误。 非常抱歉我迟迟才修复此错误。
- 2005 年 10 月 05 日 - 添加了文本换行功能。
- 2005 年 9 月 13 日 - 添加了多行和设置每行高度的功能。 它也可以像文本换行功能一样使用。
- 2005 年 9 月 12 日 - 更改了纸张上的列位置寻址。 使用起始-结束位置而不是一个位置。