摘要:对合同文本手工录入方式存在的问题进行了分析,提出在C#环境下利用COM组件读/写MS Office Word和Ex-cel文件的技术,自动地生成Word格式合同文件的方法,并且根据该方法实现了自动生成合同文件的软件系统。通过在陕西省电力物资公司的实际应用,验证了该方法的可行性和高效性。
0 引言
伴随计算机和网络技术的飞速发展,电力企业大规模开展了信息网络的建设和信息系统的开发,信息技术的应用领域已经深入到电网生产、经营和管理的各个环节。电力物资公司作为电力系统的物资专营企业,主要承担着电力设备的招标、订货和采购工作,日常业务需要处理大量的合同数据。
目前物资合同数据来自于电系统的ERP 数据库,以Excel文件格式导出,采用人工方式把数据文件中的合同数据填入Word 格式的标准合同文件。在该过程中,人工填写数据的做法存在问题较多。通常一个Ex-cel数据文件就会有几十甚至数百份合同数据,如果采用人工录入数据的方式不仅劳动量大、生成合同速度慢、而且还容易出错;另外,如果Word合同模板发生变化,需要添加或删除一些数据项,那么按照原合同模板制作的合同就需要逐份修改或重新录入,因而维护合同文件十分困难、不灵活。
为了解决这些问题,本文讨论了如何在C#环境下,利用COM 组件读/写MS Office Excel 和Word 文件的技术,研究自动地生成合同文件的方法,实现了自动生成合同文件的软件系统,该系统的应用将大幅削减人为操作、提高工作效率和质量、进而提升企业形象带来良好的社会效益。
1 C#处理Excel 和Word 文档的方式
用Excel作为数据源保存数据,用Word作为数据呈献的载体显示数据,是企业信息系统输出数据时采取的典型的做法。本文的合同自动生成系统采用了这一方法。另外,在C#开发平台下,微软公司提供了专用于Office 开发的程序集和相关的Office 应用程序对象模型,即COM.利用COM 和相关的程序集,可以在C#平台上实现对MS Office文件的各种操作。
1.1 用C#读取Excel文件
合同数据来自于ERP 系统数据库,并且已经导出到Excel数据文件中,Word格式的合同将使用该数据文件来生成。因此首先读取Excel数据文件的内容,这里有2种方法。
1.1.1 种方法
利用COM组件技术读取Excel数据文件,用到的组件包括:
(1)Application对象,该对象处于Excel对象的层次的顶端,表示Excel应用程序的运行环境,即该对象生成时会产生一个excel进程。
(2)Workbook 对象,该对象直接位于Application 对象的下层,表示一个Excel工作薄文件。
(3)Worksheet对象,包含在Workbook对象中,表示一个Excel工作表。
(4)Range对象,包含在Worksheet对象中,表示Ex-cel工作表中的一个或多个单元格。
读取Excel文件内容的步骤如下:
①生成Excel应用对象
Excel.Application excelApp = new Excel.ApplicationClass();
②生成工作薄对象
Excel.Workbook excelBook = excelApp.Workbooks.Open(Ex-celFilePath,Type.Missing,…);
③利用Excel数据文件中的张工作表生成工作表对象
Excel.Worksheet excelSheet = (Excel.Worksheet)excelBook.
Sheets[1];
④设置读取位置
Excel.Range excelRange = excelSheet.get_Range(A1,Miss-ing.Value);
⑤获取该位置的内容
excelRange.toString()
经过测试,发现该方法存在如下缺点:如果程序在读取Excel数据文件的同时,需要用Excel程序打开该文件,则只能以只读副本的方式打开;程序在整个执行的过程中,需要Application对象一直存在,而该对象的本质是一个Excel进程,它占用的系统资源多;Excel的Range对象对单元格逐个定位,导致程序运行速度慢。
1.1.2 第二种方法
利用COM 中的数据存取组件ADO.Net,该组件中包含了OleDbDataAdapter 对象,通过它可以把Excel 数据文件当作数据库来读取。读取步骤如下:
(1)创建连接字符串
string sConnStr=“Provider=Microsoft.Jet.Oledb.4.0; DataSource=”+sExcelFile+“;Extended Properties=Excel 8.0″;OleDb-Connection connection=new OleDbConnection(sConnStr);
(2)使用COM组件,创建数据连接适配器
OleDbDataAdapter adp = new OleDbDataAdapter(”Select *from [Sheet1$]“,connection);
(3)使用数据适配器的填充方法填充数据集对象dsDataSet ds = new DataSe(t );
adp.Fil(l ds);
这种方法把Excel数据文件中的信息作为一个二维表读入到数据集对象DataSet中,该方法具有的优点是:
(1)不产生excel应用对象,因此系统资源占用少,另外ADO组件对象在填充完DataSet后可以释放掉,更加节省系统资源;
(2)不用逐个生成Rang对象对单元格逐个定位,采用类似二维数组下标方式对数据定位,程序运行效率显着提高。
1.2 用C#写入Word文件
这里采用了与读写Excel相似的做法,即用COM组件操作Word 文档。对于Excel 中直接提取的数据,例如:合同编号和设备名称等,采用查找-替换的方式写入Word文件中;对于需要进行格式化处理后再写入Word文档的数据,例如:大写合同金额和采购日期等,采用查找-修改-替换的方式写入。用到的对象包括:
(1)Word.ApplicationClass 对象,该对象表示Word应用程序环境。
(2)Word.Document对象,该对象提供Word 文档的处理功能,对应于具体的磁盘文件。
写入步骤如下:
①设置空实参对象
Object m_Nothing = System.Reflection.Missing.Value;
②生成Word应用对象
Word.Application wordApp = new Microsoft.Office.Interop.
Word.ApplicationClass();
③生成Word文档对象
Word.Document wordDoc = wordApp.Documents.Open(合同模板文件所在路径,ref m_Nothing,…);
④设置要搜索的字符串,findtext 是字符串类型的对象
object objectfindtext = findtext;
⑤设置要替换的字符串,replaceWith是字符串类型的对象
object objectreplacewith = replacewith;
⑥使用Word 应用对象的Selection.Find.Execute()方法完成字符串的查找和替换操作
wordApp.Selection.Find.Execute(ref findtext,…,ref m_Re-placewith,ref m_Replace,…);
该方法的m_Replacewith 和第m_Replace 参数分别表示要在Word文件中查找的字符传和替换字符串。
2 系统模块结构
设计合同自动生成系统的目标是让合同编制人员能够灵活、快捷、准确地生成合同文档。该系统的整体架构如图1所示。首先从ERP中导出要生成的合同数据,将其存放在一份Excel文件中。然后根据需要准备Word标准模板(注:此处的”模板“仍是一个以doc为后缀的文档,不是指后缀名为dot的Word模板文件,文中出现的模板二字均照此意理解)。,系统的部分是合同自动生成程序,它的主要功能是按照输入的Word标准合同模板,从Excel文件中提取所需的数据并写入Word合同文件,从而形成符合要求的合同文本。
Excel 数据文件中包含2 种不同类型的合同数据:
单行合同数据(即Excel中的一行记录对应一份合同)和多行合同数据(即Excel中多行记录对应一份合同)。对于一份完整的Word格式合同,一般的文本数据可以采用查找-替换或查找-修改-替换的方式写入,但是合同中的明细表大小不固定,单行合同数据的明细表中只有一条记录而多行合同数据的明细表中有多条记录。系统要针对不同类型的合同数据进行分别处理。
3 标准合同生成过程
3.1 Word标准合同模板制定
使用合同生成系统之前,需要准备Excel数据文件和Word标准合同模板文件。
Excel数据文件直接从ERP数据库中导出。
Word标准合同模板中包含2种性质的文字:固定不变的内容,即每份合同都相同的部分,例如合同中的法律声明、甲方联系人、甲方单位地址等文字信息;以及发生变化的内容,例如合同中的产品名称、产品价格等信息,这些变化内容来自于Excel数据文件,每份合同都不相同。对于可变的内容用统一格式的字符串填写,该字符串本质上起到占位符的作用,在自动填入信息时有助于查找和替换操作。它由2部分组成,是不会引起歧义的前后缀;第二是被前后缀围堵的部分,用来说明被替换的内容在Excel数据文档中的列名称。例如”au-togen工程项目autogen“字符串表示应该用Excel数据文档中名称为”工程项目“的列所对应的内容来替换此处的字符串,添加前后缀”autogen“可以避免与合同的其他固定内容冲突,不会导致错误替换。当然,对Word文档进行定位可采用的技术还包括书签定位、域定位等[3-10],但不如直接填写查找字符串方便,比较适合标准模板的编写人员所采用。
另外,对于合同模板中的”明细表“,其中要填写的记录数量不固定,不能用查找和替换方式写入合同,对此采用了动态处理的办法,在程序中根据具体的明细数据行数向明细表填写数据。
Word 标准合同模板的准备工作比较复杂,但是该模板一般不会发生变化。如果必须修改标准合同模板,模板修改只需修改固定内容或添加/删除可变内容的替换字符串即可。
3.2 自动生成Word标准合同
自动生成Word标准合同的算法如图2所示。大致可以分为4个步骤:
(1)把Excel数据文件中的信息读取到DataSet数据集合内;
(2)检查DataSet中的当前行数据是否为新合同数据的开始,即合同首行数据,如果存在该行数据则打开Word合同模板,采用逐项查找-替换或查找-修改-替换的方法填充合同模板中的可变数据;如果该行数据不存在,则说明已经处理至数据文件末尾,退出程序;
(3)检查该份合同是否有明细项(行),如果有则采用循环的方式逐行把明细项填入Word模板中的”明细表“,如果没有则直接把合同数据首行写入该表。
(4)保存按模板生成的合同,然后返回到步骤(2)。
在步骤(2),(3)中如果读取到的数据无效,则当前的合同文件生成立即终止,并把无效数据出现的位置向用户,计算下一份合同的开始位置,从步骤(2)继续运行。
4 标准合同生成技术的实际应用
基于COM组件的合同文本自动生成系统在陕西省电力物资公司进行了实际应用。操作人员输入Excel合同数据文件和标准合同模板文件后,程序将根据数据文件的内容逐份生成合同文档,如图3所示。若某个合同数据出现错误,则该错误所在数据文件的行号和字段,终止生成该合同,并继续处理后续合同数据。从只有几份合同数据到数百份合同数据的Excel文件,整个自动生成过程需要数秒到数十秒时间。如果全由人工编写合同文档,少则需要数小时时间录入、校对,多则需要数天时间。该系统的应用把操作员从繁重手工作业中解放出来,避免了手工操作所带来的遗漏和错误,使合同文档的生成工作更加标准化、规范化,大大提高了工作效率。
5 结语
本文在基于COM组件技术对Excel和Word操作支持的基础上,提出了自动生成Word格式合同文档的方法,并根据该方法实现了合同文档自动生成系统。在陕西省电力物资公司的实际应用中,验证了这种技术的可行性和高效性。
但是,系统仍有一些不足之处,还存在以下几方面的后续研发工作:Word合同模板中动态内容的增减仍要靠人工打开Word文档增删占位字符串,应能提供更好的人机界面,通过鼠标拖拽的方式从Excel数据文件中选择出Word合同模板所需的占位字符串。从而提高模板制作的自动化程度,减少人为操作失误;标准化合同模板的规范化问题,合同模板的规格和标准越规范,利用计算机技术进行自动化处理的程度就越高;该软件系统能否自动生成其他类型的文件,即能否提高它的抽象性和通用性问题。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。