📄 用delphi实现自己的excel报表.txt
字号:
公有方法:
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中查找特定Name的DataSet
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; //取单元格内容
if IsTamplateElement(CellValue) //判断是否为模板元素
begin
if IsDataSetBeginElement(CellValue) then //判断是否为数据集开始元素
begin
ProcessDataSetElement (CellValue); //处理数据集元素
end;
if IsParamElement then(CellValue) then //判断是否为变量元素
CellObj.Value := FindParam(CellValue); //查找变量值,填到当前单元格中
if 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,并注册到Delphi的IDE中,以便以后使用。在上而提到的类的事件,是用来实时通知客户当前正在处理哪个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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -