Excel报表与后台数据
如果你是一个网页设计高手,那么网页的数据展示能力是非常优秀的。
但绝大多数用户,包括我自己,都无法设计出高水准的网页,所以需要一个简单的替代工具,实现复杂数据的展示,特别是手机端的复杂数据展示。
我们选可以利用Excel报表来完成这项任务,但是在Foxtable 2017之前,Excel报表只能根据已经加载的数据生成,而作为服务端程序,通常是没有办法将所有数据加载的。
所以,我们对Excel报表进行了改进,使得其可以直接基于后台数据生成报表。
一个例子
如果你设计了一个下图所示的Excel报表模板:
假定系统并没有加载员工表,或者员工表只加载了部分数据,我们用下面的代码,一样可以从后台提取未加载的数据来生成报表,而且非常简单:
Dim
Book As
New XLS.Book(ProjectPath
& "Attachments\资料卡.xls")
Dim
fl As
String =
ProjectPath &
"Reports\资料卡.xls"
book.AddDataTable("员工","数据源名称","Select
* from {员工} where 姓名 = '王伟'")
Book.Build()
Book.Save(fl)
Dim
Proc As
New
Process
Proc.File
= fl
Proc.Start()
这是生成的报表:
提示:
AddDataTable方法用于从后台提取数据生成一个临时表,由Excel报表模板根据此临时表生成报表。
例如上面的代码中,AddDataTable利用Select语句生成了一个临时表,表名为"员工"。
系统在生成Excel报表的过程中,优先调用AddDataTable生成的临时表,无需担心和现有同名表产生冲突。
AddDataTable的语法为:
AddDataTable(Name,DataSouce,SelectString)
AddDataTable(Name,DataTable)
Name | 字符型,临时表的名称,必须和报表模板中的表名保持一致。 |
DataSouce | 字符型,用于指定数据源名称。 |
SelectString | 字符型,用于指定Select语句 |
DataTable | DataTable型,用于直接指定一个临时DataTable作为报表的数据来源,此DataTable不能是DataTables中的一员。 GroupTableBuilder、CrossTableBuilder、SQLGroupTableBuilder、SQLCrossTableBuilder、SQLJoinTableBuilder和DataTableBuilder的Build方法,都有一个逻辑参数,将此参数设置为True,将生成一个DataTable,此DataTable将不会包括在DataTables中。
例如: |
多个数据表和关联
我们可以添加多个临时表,而且可以在临时表之间建立关联。
假定设计了下图所示的报表模版,用于生成出库单。
此模版涉及到出库和出库明细两个表,这两个表通过出库单号建立关联。
不管系统是否已经加载了这两个表,我们都可以通过下面的代码生成一个出库单:
Dim
Book As
New XLS.Book(ProjectPath
& "Attachments\出库单.xls")
Dim
fl As
String =
ProjectPath &
"Reports\出库单.xls"
book.AddDataTable("出库","数据源名称","Select
* from {出库} where 出库单编号= 'CK-20030726001'")
'添加父表
book.AddDataTable("出库明细","数据源名称","Select
* from {出库明细} where 出库单编号= 'CK-20030726001'")
'添加子表
book.AddRelation("出库","出库单编号","出库明细","出库单编号")
'建立关联
Book.Build()
'生成细节区
Book.Save(fl)
'保存工作簿
Dim
Proc As
New Process
'打开工作簿
Proc.File =
fl
Proc.Start()
这是生成的报表:
提示: AddRelation方法用于在临时表之间建立关联。
AddRelation的语法为:
AddRelation(ParentTable,ParentCol,ChildTable,ChildCol)
ParentTable | 字符型,父表名称。 |
ParentCol | 字符型,父表关联列名称,如果有多个关联列,可以用一个字符型数组表示。 |
ChildTable | 字符型,子表名称。 |
ChildCol | 字符型,子表关联类名称,如果有多个关联列,可以用一个字符型数组表示。 |