l 从用户角度:
载体本身具有脚本支持公式编辑模板支持格式、版式设计等诸多功能而这些功能对于大部分用户是比较熟悉省去了用户培训环节;多数办公用电脑都装有Office软件Software所以其输出报表可以被任何装有Office软件Software计算机浏览;
l 从开发者角度:
可以通过OLE访问提供了大量编程接口几乎所有操作都可以用来控制;利用宏、VBA等技术可以很轻松地编写报表设计模块
整体思路:
通过OLE获取ExcelSheet对象遍历每个单元格将模板中元素以变量、表格等替换就生成了最终报表其中元素种类可分为变量元素、数据集元素、数据字段元素和其它标志元素它们都是处于单元格内包含特殊格式串格式可以自由定义但要保证此格式不会和正文相冲突
如:
#ValueAA# (变量名两边加入#号当遍历到其所在单元格时在中对单元格进行相应处理)
报表功能实现:
首先新建Excel模板如下图:
模板保存为template.xlt
现在模板有了现在需要实现功能就是分析此模板将模板中元素替换为中将要输出变量或数据表
下面我们来设计个简单模板分析类(TXlTemplateAnalyzer):
公有思路方法:
generateReport //套用模板生成最终报表
registerDataSet //在DataSet列表中新增数据集
registerParam //在Param列表中新增变量
removeDataSet //在DataSet列表中删除数据集
removeParam //在Param列表中删除变量
SetSheetObject //设置模板Sheet对象
私有成员变量:
FBoundLeft, FBoundRight //保存左右列边界
FDataSetList //用于维护数据集列表私有成员
FParamList //用于维护变量列表私有成员
FExcelSheetObject //被操作模板Sheet对象
FCurrentRow //当前处理行号
FCurrentCol //当前处理列号
私有工具思路方法:
ProcessDataSetElement //处理数据集元素
getTemplateBoundary //获取边界索引号
parsorFieldNameFromElement //从模板元素中提取字段名
FindParam //从FParamList中查找特定Name变量
FindDataSet //从DataSetList中查找特定NameDataSet
IsTamplateElement //判断是否为元素
IsDataSetFieldElement //是否为数据字段元素
IsDataSetBeginElement //是否为DataSet起始元素
IsControlTag //是否为控制元素
IsParamElement //是否为变量元素
事件:
OnParamElement
OnDataSetOperationElement
OnControlElement
OnDataSetFieldElement
OnElement
写到这里大家可能已经知道我用意了:其实这么多类成员中但其核心就在于generateReport和ProcessDataSetElement这两个思路方法
(以下代码只是描述性脚本代码在Delphi中不能编译)
generateReport:
------------------循环遍历单元格---------------------
FCurrentRow := iRow;
FCurrentCol := iCol;//保存当前正在处理行列索引号
CellObj := FExcelSheetObject.Cells[iRow, iCol];//取当前单元格对象
CellValue := CellValue.Value; //取单元格内容
IsTamplateElement(CellValue) //判断是否为模板元素
begin
IsDataSetBeginElement(CellValue) then //判断是否为数据集开始元素
begin
ProcessDataSetElement (CellValue); //处理数据集元素
end;
IsParamElement then(CellValue) then //判断是否为变量元素
CellObj.Value := FindParam(CellValue); //查找变量值填到当前单元格中
IsControlTag(CellValue) then
………………….
end;
------------------遍历循环结束---------------------
执行到这里报表生成完毕
ProcessDataSetElement:
ADataSet := FindDataSet(CellValue);
for j:=0 to ADataSet.RecordCount - 1 do
begin
FExcelSheetObject.Rows[FCurrentRow + j].Delete;//将当前行删除(也就是#Table.Begin#所在行)
FExcelSheetObject.Rows[FCurrentRow + j].Insert;//新增行
FExcelSheetObject.Rows[FCurrentRow + j].Copy(FExcelSheetObject.Rows[FCurrentRow + 1]);
for i:= FBoundLeft to FBoundLeft do
begin
fieldCellStr := FExcelSheetObject.Rows[FCurrentRow + j].Cell[i].Value; //获取数据字段元素
fieldname := parsorFieldNameFromElement(fieldCellStr); //从元素中解析字段名
FExcelSheetObject.Rows[FCurrentRow + j].Cell[i] := ADataSet.FieldByName(fieldname).Value; //将//相应字段值赋入单元格
end;
ADataSet.Next;
end
FCurrentRow := FCurrentRow + j;
到这里这个模板分析类核心功能基本完成了我想如果这个类实现代码全部完成后应该把这个类做成个Component并注册到DelphiIDE中以便以后使用在上而提到类事件是用来实时通知客户当前正在处理哪个Element和Cell客户可以在此事件中做更进步特殊处理(例如将上述模板中产值小于完成计划数单元格置为红色等等)非常灵活但是出于代码整洁在这里我没有加到代码中另外在中还可以在报表中加入Excel各种Chart、Shape等对象这些留着我以后再写吧
TXlTemplateAnalyzer类是这样:
begin
1先将数据集、变量注册
templtAnalyzer.RegisterDataSet(DataSet1, ‘Table);
templtAnalyzer.RegisterParam(Now, ‘Date’);
templtAnalyzer.RegisterParam(totalQu, ‘TotalQuantity’);
templtAnalyzer.RegisterParam(totalPlan, ‘TotalPlan’);
templtAnalyzer.RegisterParam(totalPer, ‘TotalPercent’);
2生成报表
templtAnalyzer.generateReport;
end;
参考文档:MSDN:Microsoft Developer Net
好了大家不妨按我思路试试希望我这篇文章能给大家带来帮助
本人口才不好又是初次写文档难免会有不合适地方欢迎大家指正我定会继续努力
最新评论