图1 系统设计思路流程图 |
首先筛选必要的成果要素利用Word作一个录入模板。Word模板较常见的有两种做法:一种是在Word文档相应的位置插入书签;另一种是在Word文档的相应位置插入特殊符号。插入书签的具体做法是:选中要插入书签的区域,在Word的插入菜单中选择书签,填写书签名称,点击添加即可。在Word文档中插入特殊符号的思路是:将需要提取的内容用特殊字符包起来,系统利用特殊字符识别要导入的内容,例如#中国#,表示中国是要提取的内容。但是利用以上两种模板制作方法都有缺陷,尤其是将模板既作为输出界面,也将其作为录入界面时。首先对于利用书签的模板方法,用户在实际录入数据的过程中,很容易将书签误删除。插入特殊符号的方法无疑增加了用户录入时的负担,且界面也不美观,没有保持文档原貌。但这两种方法的基本思路都一样,即创造要提取要素的特征符号。
借鉴以上两种模板设计方法的成功经验,笔者提出的模版设计思路是:成果的所有要素分门别类存储在Word文档的不同表格中,采用Word表格的具体要素—单元格作为文档内容的识别依据,系统根据Word表格中单元格的索引进行提取。但是这种设计思路必须能处理两种情况:一种是每个Word表格对应数据表中的一条记录即单元格数固定的情况;另一种是一个Word表格对应数据表中多行记录即单元格数可变的情况。现笔者开发的系统已完全能自如处理这两种情况。
其次是成果文档的导入。导入时,一般存在两种情况:一是导入单个成果文档,二是同时导入多个成果文档即文件夹的方式。成果文档的导入实际上是Word文档内容的提取问题,提取的关键是成果文档中图片的提取以及成果详细内容的提取,在该系统中图片格式只能为BMP格式。对于成果详细内容,由于内容中有可能包括文本框、表格、图片等要素,因此采用了SQL Server中的Ntext类型字段。对于图片和详细内容的提取,都采用了剪贴板作为Word数据和数据表数据交换的媒介。导入时的另一个问题是单元格内容的判定,即如何判定当前单元格内容是数据表字段所需要的。
对于单元格数固定的表格,Word表格的单元格和数据表中的一条记录中的字段是一一对应的,但对于单元格数可变的情况,必须增加单元格内容判定的功能。同时导入多个文档时,存在要导入的文档或文件夹中含有其它Word文档的情况,因此必须对欲导入的文档进行身份识别。对应前面的模板设计方法,一般的识别方法是识别书签或者识别在文档的某个位置加上的特殊字符。但是这两种识别方法的缺陷也是显而易见的,识别标志容易误删除。
但文档识别的基本思路是利用文档模板区别于其他文档的特征加以识别。借鉴已有的识别方法的成功经验,笔者提出的文档识别方法是:从成果模板本身的特征出发,用三个限制条件进行判断。一是成果文档中共有三个表格,二是成果文档的第一个表格共两行,三是成果文档的第三个表格共两行。以上三个限制条件足以保证成果文档的正确识别。当然不同的成果模板可以根据其具体特征进行具体分析,这是文档识别的基本思路。
再次是成果文档的导出。导出时,依然以Word中的单元格作为识别单位。导出时的最常见问题是,对于多记录情况,Word表格应该能根据记录数的多少自动调整行数,且进行单元格的合并和拆分。在笔者开发的系统中,该问题也已成功解决。另外,从用户角度考虑,系统还实现了导出时将导出文档合一的功能即将多个文档导出为一个文档,大大方便了用户的浏览和编辑。
为了充分发挥Delphi强大的数据管理功能,系统中同时提供了手工维护功能,即以传统的系统界面进行成果的增删改的功能,这样保证了修改内容和导出成果文档的一致性,同时又便于查询和统计。
结论
Delphi+Word的数据处理方式,可以实现系统的脱机使用,符合系统分布式布署的思想,同时又便于用户熟练掌握,符合系统集成的思想。这种全新的数据处理方式在笔者的系统中得到了较好的验证和使用,为以后的数据库系统开发提供了一条新的解决思路。采用Word作为数据录入和输出的前端工具的系统设计思路,同样适用于其他语言的数据库系统开发,尤其适用于大量的数据处理的数据库系统。