0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于COM组件和Ex-cel文件的技术实现合同自动生成系统的设计

电子设计 作者:电子设计 2018-11-23 10:06 次阅读

引言

伴随计算机和网络技术的飞速发展,电力企业大规模开展了信息网络的建设和信息系统的开发,信息技术的应用领域已经深入到电网生产、经营和管理的各个环节。电力物资公司作为电力系统的物资专营企业,主要承担着电力设备的招标、订货和采购工作,日常业务需要处理大量的合同数据。

目前物资合同数据来自于电系统的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格式合同,一般的文本数据可以采用查找-替换或查找-修改-替换的方式写入,但是合同中的明细表大小不固定,单行合同数据的明细表中只有一条记录而多行合同数据的明细表中有多条记录。系统要针对不同类型的合同数据进行分别处理。

基于COM组件和Ex-cel文件的技术实现合同自动生成系统的设计

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)继续运行。

基于COM组件和Ex-cel文件的技术实现合同自动生成系统的设计

4 标准合同生成技术的实际应用

基于COM组件的合同文本自动生成系统在陕西省电力物资公司进行了实际应用。操作人员输入Excel合同数据文件和标准合同模板文件后,程序将根据数据文件的内容逐份生成合同文档,如图3所示。若某个合同数据出现错误,则报告该错误所在数据文件的行号和字段,终止生成该合同,并继续处理后续合同数据。从只有几份合同数据到数百份合同数据的Excel文件,整个自动生成过程需要数秒到数十秒时间。如果全由人工编写合同文档,少则需要数小时时间录入、校对,多则需要数天时间。该系统的应用把操作员从繁重手工作业中解放出来,避免了手工操作所带来的遗漏和错误,使合同文档的生成工作更加标准化、规范化,大大提高了工作效率。

基于COM组件和Ex-cel文件的技术实现合同自动生成系统的设计

5 结语

本文在基于COM组件技术对Excel和Word操作支持的基础上,提出了自动生成Word格式合同文档的方法,并根据该方法实现了合同文档自动生成系统。在陕西省电力物资公司的实际应用中,验证了这种技术的可行性和高效性。

但是,系统仍有一些不足之处,还存在以下几方面的后续研发工作:Word合同模板中动态内容的增减仍要靠人工打开Word文档增删占位字符串,应能提供更好的人机界面,通过鼠标拖拽的方式从Excel数据文件中选择出Word合同模板所需的占位字符串。从而提高模板制作的自动化程度,减少人为操作失误;标准化合同模板的规范化问题,合同模板的规格和标准越规范,利用计算机技术进行自动化处理的程度就越高;该软件系统能否自动生成其他类型的文件,即能否提高它的抽象性和通用性问题。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87590
  • 计算机
    +关注

    关注

    19

    文章

    6646

    浏览量

    84490
  • 人机界面
    +关注

    关注

    5

    文章

    497

    浏览量

    43711
收藏 人收藏

    评论

    相关推荐

    labview COM组件在客户机如何实现自动注册?

    基于 labview的软件设计中,利用了COM组件技术,当该软件给客户用时不能让客户来点击.EXE注册吧,请问该如何实现???
    发表于 02-21 15:22

    周立功联手CEL公司力推ZigBee技术.

    周立功联手CEL公司力推ZigBee技术.
    发表于 08-13 20:33

    labvIEW调用matlab生成COM组件

    我用labvIEW调用matlab生成COM组件时,有几个问题。麻烦大家帮我看看是哪块不合适,非常感谢上面这个调用成功,只是运行比较慢。没有错误下面这个labvIEW运行时出错程序是用matlab的cftool的File-->
    发表于 12-12 19:07

    LabView调用com组件的问题。

    问题描述: 我需要在LabView中调用matlab程序,使用com组件实现组件matlab下生成了DLL
    发表于 05-12 11:13

    合同智能审查技术促进智能金融发展

    合同审查软件能够实现以下功能:智能抽取:提取文档内容的主要信息,让审阅过程更高效。智能比对:比对不同版本、纸质和电子版合同的差异,生成对比报告。智能审核:配置专业知识与审核规则,比如:
    发表于 05-26 21:57

    基于模型设计的HDL代码自动生成技术综述

    设计和统一建模语言(UML :Unified Modeling Language)作为一种与平台无关的建模方法,在电子系统设计中得到了广泛的关注。现存的几种UML配置文件在UML级别建模硬件组件,并
    发表于 06-08 09:29

    自动生成特定伪码的设计与实现

    针对屏幕显示设计效率较低的情况,完成了自动生成用户交互界面伪码的设计,实现自动生成屏幕显示伪代码的系统
    发表于 05-11 20:19 19次下载

    COM技术在软件可测试性中的应用

    为解决某导弹自动测试系统软件测试难度大的问题,介绍了常用提高软件可测试性的方法和DLL技术。并运用COM技术设计出该
    发表于 06-01 11:55 9次下载

    基于COM技术的串口通信组件的设计

    分析了目前对串口编程存在的问题,介绍了COM技术及其在RS232串口通信的应用,指出使用组件相对于ActiveX控件及Windows API编程的优点。基于COM
    发表于 09-02 09:06 17次下载

    JAVA中基于JACOB的COM组件调用研究

            本文在研究了COM 组件复用,自动化和JNI 技术的基础上,详细阐述了JACOB
    发表于 09-05 10:41 26次下载

    基于ActiveX自动技术实现路线平面图的自动生成

    基于ActiveX自动技术实现路线平面图的自动生成 摘要:公路作为主要的交通设施,对国民经济的发展起着至关重要的作用. 分析了我国公路行
    发表于 04-29 11:54 16次下载

    COM组件技术在现场总线控制系统组态软件中的应用

    摘要:简要介绍现场总线控制系统的组成以及组成软件的功能,重点讲述了COM组件技术在组态软件中的应用及VxD驱动程序的开发。
    发表于 03-24 12:48 518次阅读
    <b class='flag-5'>COM</b><b class='flag-5'>组件</b><b class='flag-5'>技术</b>在现场总线控制<b class='flag-5'>系统</b>组态软件中的应用

    智能变电站SCD文件虚回路自动生成技术的设计和实现

    方法,开发了一种虚回路自动生成技术。该技术可以解析模板文件,依据模板文件内设备的IEDname
    发表于 03-22 14:25 0次下载
    智能变电站SCD<b class='flag-5'>文件</b>虚回路<b class='flag-5'>自动</b><b class='flag-5'>生成</b><b class='flag-5'>技术</b>的设计和<b class='flag-5'>实现</b>

    英创信息技术利用COM组件远程更改设备配置文件的流程

    基于COM而建立起来的。COM标准包括规范和实现两大部分,规范部分定义了组件组件之间通信的机制,这些规范不依赖于任何特定的语言和操作
    的头像 发表于 11-04 09:48 1110次阅读
    英创信息<b class='flag-5'>技术</b>利用<b class='flag-5'>COM</b><b class='flag-5'>组件</b>远程更改设备配置<b class='flag-5'>文件</b>的流程

    如何在VScode中自动生成Verilog仿真文件

    一、实现功能 1、可以自动创建文件夹 2、根据Verilog文件自动生成测试
    的头像 发表于 06-23 17:48 3021次阅读