用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/


Excel连接Mysql创建自动化报表

下载完成后按照向导按照完成。


Excel连接Mysql创建自动化报表

安装完成后,打开Exccel,会弹出一个提示,确认安装该自定义项。

Excel连接Mysql创建自动化报表

安装完成后,在Excel菜单上会多出【Mysql for Excel】功能


Excel连接Mysql创建自动化报表
Excel连接Mysql创建自动化报表

02

启动Mysql服务,用Excel连接Mysql


点击【数据】菜单下的【Mysql for Excel】按钮,弹出Mysql连接管理面板。


Excel连接Mysql创建自动化报表


点击【New Connection】,弹出数据源连接配置信息界面。


按下图所示,配置连接名称、数据库IP或主机名、用户名、密码、端口号等信息,点击下方测试。


Excel连接Mysql创建自动化报表


出现连接成功信息,表示Mysql连接成功。


Excel连接Mysql创建自动化报表


在Mysql管理面板中,可以选择数据库和表了。

Excel连接Mysql创建自动化报表


双击数据库名,就可以读取表和视图了。


Excel连接Mysql创建自动化报表


可以直接导入数据库的表到excel中。


Excel连接Mysql创建自动化报表


进入导入向导界面,可以做一些配置。


Excel连接Mysql创建自动化报表


导入到Excel之后的效果。


Excel连接Mysql创建自动化报表


除过可以展示Excel数据之外,【Mysql for Excel】还提供了对数据库数据进行修改和添加的能力


Excel连接Mysql创建自动化报表

03

设置数据定时刷新

数据刷新的方式和上期SqlServer的一样,都是利用Excel对数据库的刷新能力,可以手动,也可以定时自动刷新。


手动刷新


Excel连接Mysql创建自动化报表


定时自动刷新

在连接属性当中,打开【设置刷新频率】,根据自身需求来设置合理的刷新频率即可。

Excel连接Mysql创建自动化报表

更多Excel与数据科学知识,请扫码关注:Excel与统计分析

以上是关于用Delphi实现自己的Excel报表的主要内容,如果未能解决你的问题,请参考以下文章

delphi 报表

delphi 如何在Delphi中执行将Excel表格里的内容导入数据库中相应表

PDF格式财务报表转Excel格式

怎样用VB读取Excel文件中表格中的数据?

delphi转excel

怎么在delphi中读取Excel数据 转