对于程序员特别是从事信息管理编程的程序员来说,报表打印是整个编程过程中最麻烦但又必须做的事情,我们常用的方法就是:
一、将数据库记录导出到Excell中;
二、用CrystalReport或ActiveReport等报表工具生成报表文件然后再在程序中调用;
三、直接打印窗体;
对于第一种方法网上有许多文章介绍了怎样将数据表记录导入到Excell中并怎样控件Excell单元格式以便做出合适的报表,但是这种方法也有许多不便之处,一是用户的计算机上必须安装Excell,这显然不现实(当然盗版的另当别论),二是Excell自带的是ActiveX控件,虽然.Net仍支持ActiveX控件,但这与.Net的发展趋势显然是不相符的。
对于第二种方法网上与CrystalReport或ActiveReport相关的资料很少,而且使用也相当复杂,怎么制作报表全凭程序员自己摸索。
对于第三种方法除非想证明自己是菜鸟,否则没有人会使用。
既然如此,我们可不可以利用.Net提供的强大功能自己开发类似于Excell的控件呢?其实要开发一个控件只要做两件事,其一是定义各种属性和方法,其二是根据各种属性绘制控件界面。
下面我们来分析一下Excell的结构,Excell呈现给我们的是一张二维结构的表格,每一行相当于数据表的一个记录,每一列相当于数据表的字段。但Excell的每个单元又有许多的格式控件单元的呈现方式,这就是Excell与别的表格控件如DataGrid不相同的地方,那么如何实现每个单元都有不同的呈现方式呢?
首先我们可以定义一个类名称假设为DataCell,这个类定义了各种属性比如:背景颜色、文本颜色、文本字体、对齐方式、文本折行、单元宽度、单元高度等等,然后我们定义一个Arraylist对象,名称假设为DataRow,一个DataRow加载适当数量的DataCell对象,这个DataRow对象就相当于Excell的一行记录。
第二步我们再定义一个Arraylist对象,名称假设为DataTable,每个DataTable又加载一定数量的DataRow,那么这个DataTable对象其实就是一个有一定数量记录的二维表格了,只是这个表格的单元都有不同的格式。
第三步就是绘制控件界面了,在这一步我们可以利用Graphics的DrawString、DrawLine、DrawRectangle、强大功能,根据DataCell对象提供的不同格式任意绘制控件界面了。