知识大全 用Delphi实现自己的Excel报表

Posted 元素

篇首语:后悔过去,不如奋斗将来。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Delphi实现自己的Excel报表相关的知识,希望对你有一定的参考价值。

用Delphi实现自己的Excel报表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

 Excel是大家都比较熟悉的表格处理软件 用它来做自由报表载体其好处有

  1 从用户角度

  载体本身具有脚本支持 公式编辑 模板支持 格式 版式设计等诸多功能 而这些功能对于大部分用户是比较熟悉的 省去了用户培训环节 多数办公用电脑都装有Office软件 所以 其输出的报表可以被任何装有Office软件的计算机浏览

  2 从开发者角度

  可以通过OLE访问 提供了大量的编程接口 几乎所有的操作都可以用程序来控制 利用宏 VBA等技术可以很轻松地编写报表设计模块

  整体思路

  程序通过OLE获取Excel的Sheet对象 遍历每个单元格 将模板中的元素以变量 表格等替换 就生成了最终报表 其中元素种类可分为变量元素 数据集元素 数据字段元素和其它标志元素 它们都是处于单元格内的包含特殊格式的字符串 格式可以自由定义 但要保证此格式不会与正文相冲突

#ValueAA# (变量名两边加入#号 当遍历到其所在的单元格时在程序中对单元格进行相应处理)

  报表功能实现

  首先新建Excel模板 如下图 模板保存为template xlt

  现在模板有了 现在需要实现的功能就是分析此模板 将模板中的元素替换为程序中将要输出的变量或数据表

  下面我们来设计一个简单的模板分析类(TXlTemplateAnalyzer)

   1 公有方法

generateReport //套用模板生成最终报表

registerDataSet //在DataSet列表中新增数据集

registerParam //在Param列表中新增变量

removeDataSet //在DataSet列表中删除数据集

removeParam //在Param列表中删除变量 SetSheetObject //设置模板的Sheet对象

  2 私有成员变量

FBoundLeft FBoundRight //保存左右列边界

FDataSetList //用于维护数据集列表的私有成员

FParamList //用于维护变量列表的的私有成员

FExcelSheetObject //被操作模板的Sheet对象 FCurrentRow //当前处理的行号

FCurrentCol //当前处理的列号

  3 私有工具方法

ProcessDataSetElement //处理数据集元素

getTemplateBoundary //获取边界索引号

parsorFieldNameFromElement //从模板元素中提取字段名

FindParam //从FParamList中查找特定Name的变量

FindDataSet //从DataSetList中查找特定Name的DataSet

IsTamplateElement //判断是否为元素

IsDataSetFieldElement //是否为数据字段元素

IsDataSetBeginElement //是否为DataSet起始元素

IsControlTag //是否为控制元素

IsParamElement //是否为变量元素

  4 事件

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:= to ADataSet RecordCount do

begin

FExcelSheetObject Rows[FCurrentRow + j] Delete;//将当前行删除(也就是#Table Begin()#所在的行)

FExcelSheetObject Rows[FCurrentRow + j] Insert;//新增行

FExcelSheetObject Rows[FCurrentRow + j] Copy(FExcelSheetObject Rows[FCurrentRow + ]);

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(DataSet 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

  好了 大家不妨按我的思路试试 希望我的这篇文章能给大家带来帮助

cha138/Article/program/Delphi/201311/8465

相关参考

知识大全 EXCEL账务处理系统(录入记账凭证自动成生财务报表和登记账薄且具备出具

求助用EXCEL做账的全套电子表格!EXCEL账务处理系统(录入记账凭证自动成生财务报表和登记账薄且具备出具  以下文字资料是由(全榜网网www.cha138.com)小

知识大全 简述利用EXCEL软件制作报表要点及方法(会计报表)求详细步骤!

简述利用EXCEL软件制作报表要点及方法(会计报表)求详细步骤!  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 怎样在OracleERP报表添加Excel查看方式

怎样在OracleERP报表添加Excel查看方式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 .net中关于企业Excel报表的生成

.net中关于企业Excel报表的生成  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在一般的企

知识大全 多个Oracle数据库创建一个Excel报表

多个Oracle数据库创建一个Excel报表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  微软

知识大全 Delphi控制Excel2000心得

Delphi控制Excel2000心得  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一使用动态

知识大全 Delphi水晶报表打包解决

Delphi水晶报表打包解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!开发环境        

知识大全 在.NET环境下将报表数据导出Excel和Word[2]

在.NET环境下将报表数据导出Excel和Word[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 在.NET环境下将报表数据导出Excel和Word[1]

在.NET环境下将报表数据导出Excel和Word[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Delphi 7 中使用RAVE报表(六)

Delphi7中使用RAVE报表(六)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &