用Delphi实现自己的Excel报表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Delphi实现自己的Excel报表相关的知识,希望对你有一定的参考价值。
参考技术A 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
好了 大家不妨按我的思路试试 希望我的这篇文章能给大家带来帮助
lishixinzhi/Article/program/Delphi/201311/8465
Excel连接Mysql创建自动化报表
继上次发文讲解Excel连接SqlServer创建自动化报表获得各位同学的热烈反馈之后,本文将介绍Excel如何连接Mysql创建自动化报表。
Mysql作为在Oracle、SqlServer两大商用数据库之后排名第三的开源数据库,在众多的软件和网站中,都使用Mysql来做数据存储。因为,Excel连接Mysql实现自动化报表,必然也是非常有必要的。
虽然Excel提供了通过ODBC方法对接Mysql的能力,但ODBC需要安装ODBC驱动,并配置DSN数据源,操作比较繁琐。如果对ODBC有兴趣的同学,可以自行百度。本文将介绍更加便捷的方法。
实现步骤:
01
下载并安装 MySQL for Excel
https://downloads.mysql.com/archives/excel/
下载完成后按照向导按照完成。
安装完成后,打开Exccel,会弹出一个提示,确认安装该自定义项。
安装完成后,在Excel菜单上会多出【Mysql for Excel】功能。
02
启动Mysql服务,用Excel连接Mysql
点击【数据】菜单下的【Mysql for Excel】按钮,弹出Mysql连接管理面板。
点击【New Connection】,弹出数据源连接配置信息界面。
按下图所示,配置连接名称、数据库IP或主机名、用户名、密码、端口号等信息,点击下方测试。
出现连接成功信息,表示Mysql连接成功。
在Mysql管理面板中,可以选择数据库和表了。
双击数据库名,就可以读取表和视图了。
可以直接导入数据库的表到excel中。
进入导入向导界面,可以做一些配置。
导入到Excel之后的效果。
除过可以展示Excel数据之外,【Mysql for Excel】还提供了对数据库数据进行修改和添加的能力。
03
设置数据定时刷新
数据刷新的方式和上期SqlServer的一样,都是利用Excel对数据库的刷新能力,可以手动,也可以定时自动刷新。
手动刷新
定时自动刷新
在连接属性当中,打开【设置刷新频率】,根据自身需求来设置合理的刷新频率即可。
更多Excel与数据科学知识,请扫码关注:Excel与统计分析
以上是关于用Delphi实现自己的Excel报表的主要内容,如果未能解决你的问题,请参考以下文章