⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用delphi实现自己的excel报表.txt

📁 用Delphi实现自己的Excel报表,直接用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 + -