引言
伴隨計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,電力企業(yè)大規(guī)模開(kāi)展了信息網(wǎng)絡(luò)的建設(shè)和信息系統(tǒng)的開(kāi)發(fā),信息技術(shù)的應(yīng)用領(lǐng)域已經(jīng)深入到電網(wǎng)生產(chǎn)、經(jīng)營(yíng)和管理的各個(gè)環(huán)節(jié)。電力物資公司作為電力系統(tǒng)的物資專(zhuān)營(yíng)企業(yè),主要承擔(dān)著電力設(shè)備的招標(biāo)、訂貨和采購(gòu)工作,日常業(yè)務(wù)需要處理大量的合同數(shù)據(jù)。
目前物資合同數(shù)據(jù)來(lái)自于電系統(tǒng)的ERP 數(shù)據(jù)庫(kù),以Excel文件格式導(dǎo)出,采用人工方式把數(shù)據(jù)文件中的合同數(shù)據(jù)填入Word 格式的標(biāo)準(zhǔn)合同文件。在該過(guò)程中,人工填寫(xiě)數(shù)據(jù)的做法存在問(wèn)題較多。通常一個(gè)Ex-cel數(shù)據(jù)文件就會(huì)有幾十甚至數(shù)百份合同數(shù)據(jù),如果采用人工錄入數(shù)據(jù)的方式不僅勞動(dòng)量大、生成合同速度慢、而且還容易出錯(cuò);另外,如果Word合同模板發(fā)生變化,需要添加或刪除一些數(shù)據(jù)項(xiàng),那么按照原合同模板制作的合同就需要逐份修改或重新錄入,因而維護(hù)合同文件十分困難、不靈活。
為了解決這些問(wèn)題,本文討論了如何在C#環(huán)境下,利用COM 組件讀/寫(xiě)MS Office Excel 和Word 文件的技術(shù),研究自動(dòng)地生成合同文件的方法,實(shí)現(xiàn)了自動(dòng)生成合同文件的軟件系統(tǒng),該系統(tǒng)的應(yīng)用將大幅削減人為操作、提高工作效率和質(zhì)量、進(jìn)而提升企業(yè)形象帶來(lái)良好的社會(huì)效益。
1 C#處理Excel 和Word 文檔的方式
用Excel作為數(shù)據(jù)源保存數(shù)據(jù),用Word作為數(shù)據(jù)呈獻(xiàn)的載體顯示數(shù)據(jù),是企業(yè)信息系統(tǒng)輸出數(shù)據(jù)時(shí)采取的典型的做法。本文的合同自動(dòng)生成系統(tǒng)采用了這一方法。另外,在C#開(kāi)發(fā)平臺(tái)下,微軟公司提供了專(zhuān)用于Office 開(kāi)發(fā)的程序集和相關(guān)的Office 應(yīng)用程序?qū)ο竽P停碈OM.利用COM 和相關(guān)的程序集,可以在C#平臺(tái)上實(shí)現(xiàn)對(duì)MS Office文件的各種操作。
1.1 用C#讀取Excel文件
合同數(shù)據(jù)來(lái)自于ERP 系統(tǒng)數(shù)據(jù)庫(kù),并且已經(jīng)導(dǎo)出到Excel數(shù)據(jù)文件中,Word格式的合同將使用該數(shù)據(jù)文件來(lái)生成。因此首先讀取Excel數(shù)據(jù)文件的內(nèi)容,這里有2種方法。
1.1.1 第一種方法
利用COM組件技術(shù)讀取Excel數(shù)據(jù)文件,用到的組件包括:
(1)Application對(duì)象,該對(duì)象處于Excel對(duì)象的層次的頂端,表示Excel應(yīng)用程序的運(yùn)行環(huán)境,即該對(duì)象生成時(shí)會(huì)產(chǎn)生一個(gè)excel進(jìn)程。
(2)Workbook 對(duì)象,該對(duì)象直接位于Application 對(duì)象的下層,表示一個(gè)Excel工作薄文件。
(3)Worksheet對(duì)象,包含在Workbook對(duì)象中,表示一個(gè)Excel工作表。
(4)Range對(duì)象,包含在Worksheet對(duì)象中,表示Ex-cel工作表中的一個(gè)或多個(gè)單元格。
讀取Excel文件內(nèi)容的步驟如下:
①生成Excel應(yīng)用對(duì)象
Excel.Application excelApp = new Excel.ApplicationClass();
②生成工作薄對(duì)象
Excel.Workbook excelBook = excelApp.Workbooks.Open(Ex-celFilePath,Type.Missing,…);
③利用Excel數(shù)據(jù)文件中的第一張工作表生成工作表對(duì)象
Excel.Worksheet excelSheet = (Excel.Worksheet)excelBook.
Sheets[1];
④設(shè)置讀取位置
Excel.Range excelRange = excelSheet.get_Range(A1,Miss-ing.Value);
⑤獲取該位置的內(nèi)容
excelRange.toString()
經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)該方法存在如下缺點(diǎn):如果程序在讀取Excel數(shù)據(jù)文件的同時(shí),需要用Excel程序打開(kāi)該文件,則只能以只讀副本的方式打開(kāi);程序在整個(gè)執(zhí)行的過(guò)程中,需要Application對(duì)象一直存在,而該對(duì)象的本質(zhì)是一個(gè)Excel進(jìn)程,它占用的系統(tǒng)資源多;Excel的Range對(duì)象對(duì)單元格逐個(gè)定位,導(dǎo)致程序運(yùn)行速度慢。
1.1.2 第二種方法
利用COM 中的數(shù)據(jù)存取組件ADO.Net,該組件中包含了OleDbDataAdapter 對(duì)象,通過(guò)它可以把Excel 數(shù)據(jù)文件當(dāng)作數(shù)據(jù)庫(kù)來(lái)讀取。讀取步驟如下:
(1)創(chuàng)建連接字符串
string sConnStr=“Provider=Microsoft.Jet.Oledb.4.0; DataSource=”+sExcelFile+“;Extended Properties=Excel 8.0″;OleDb-Connection connection=new OleDbConnection(sConnStr);
(2)使用COM組件,創(chuàng)建數(shù)據(jù)連接適配器
OleDbDataAdapter adp = new OleDbDataAdapter(”Select *from [Sheet1$]“,connection);
(3)使用數(shù)據(jù)適配器的填充方法填充數(shù)據(jù)集對(duì)象dsDataSet ds = new DataSe(t );
adp.Fil(l ds);
這種方法把Excel數(shù)據(jù)文件中的信息作為一個(gè)二維表讀入到數(shù)據(jù)集對(duì)象DataSet中,該方法具有的優(yōu)點(diǎn)是:
(1)不產(chǎn)生excel應(yīng)用對(duì)象,因此系統(tǒng)資源占用少,另外ADO組件對(duì)象在填充完DataSet后可以釋放掉,更加節(jié)省系統(tǒng)資源;
(2)不用逐個(gè)生成Rang對(duì)象對(duì)單元格逐個(gè)定位,采用類(lèi)似二維數(shù)組下標(biāo)方式對(duì)數(shù)據(jù)定位,程序運(yùn)行效率顯著提高。
1.2 用C#寫(xiě)入Word文件
這里采用了與讀寫(xiě)Excel相似的做法,即用COM組件操作Word 文檔。對(duì)于Excel 中直接提取的數(shù)據(jù),例如:合同編號(hào)和設(shè)備名稱等,采用查找-替換的方式寫(xiě)入Word文件中;對(duì)于需要進(jìn)行格式化處理后再寫(xiě)入Word文檔的數(shù)據(jù),例如:大寫(xiě)合同金額和采購(gòu)日期等,采用查找-修改-替換的方式寫(xiě)入。用到的對(duì)象包括:
(1)Word.ApplicationClass 對(duì)象,該對(duì)象表示W(wǎng)ord應(yīng)用程序環(huán)境。
(2)Word.Document對(duì)象,該對(duì)象提供Word 文檔的處理功能,對(duì)應(yīng)于具體的磁盤(pán)文件。
寫(xiě)入步驟如下:
①設(shè)置空實(shí)參對(duì)象
Object m_Nothing = System.Reflection.Missing.Value;
②生成Word應(yīng)用對(duì)象
Word.Application wordApp = new Microsoft.Office.Interop.
Word.ApplicationClass();
③生成Word文檔對(duì)象
Word.Document wordDoc = wordApp.Documents.Open(合同模板文件所在路徑,ref m_Nothing,…);
④設(shè)置要搜索的字符串,findtext 是字符串類(lèi)型的對(duì)象
object objectfindtext = findtext;
⑤設(shè)置要替換的字符串,replaceWith是字符串類(lèi)型的對(duì)象
object objectreplacewith = replacewith;
⑥使用Word 應(yīng)用對(duì)象的Selection.Find.Execute()方法完成字符串的查找和替換操作
wordApp.Selection.Find.Execute(ref findtext,…,ref m_Re-placewith,ref m_Replace,…);
該方法的m_Replacewith 和第m_Replace 參數(shù)分別表示要在Word文件中查找的字符傳和替換字符串。
2 系統(tǒng)模塊結(jié)構(gòu)
設(shè)計(jì)合同自動(dòng)生成系統(tǒng)的目標(biāo)是讓合同編制人員能夠靈活、快捷、準(zhǔn)確地生成合同文檔。該系統(tǒng)的整體架構(gòu)如圖1所示。首先從ERP中導(dǎo)出要生成的合同數(shù)據(jù),將其存放在一份Excel文件中。然后根據(jù)需要準(zhǔn)備Word標(biāo)準(zhǔn)模板(注:此處的”模板“仍是一個(gè)以doc為后綴的文檔,不是指后綴名為dot的Word模板文件,文中出現(xiàn)的模板二字均照此意理解)。最后,系統(tǒng)的核心部分是合同自動(dòng)生成程序,它的主要功能是按照輸入的Word標(biāo)準(zhǔn)合同模板,從Excel文件中提取所需的數(shù)據(jù)并寫(xiě)入Word合同文件,從而形成符合要求的合同文本。
Excel 數(shù)據(jù)文件中包含2 種不同類(lèi)型的合同數(shù)據(jù):
單行合同數(shù)據(jù)(即Excel中的一行記錄對(duì)應(yīng)一份合同)和多行合同數(shù)據(jù)(即Excel中多行記錄對(duì)應(yīng)一份合同)。對(duì)于一份完整的Word格式合同,一般的文本數(shù)據(jù)可以采用查找-替換或查找-修改-替換的方式寫(xiě)入,但是合同中的明細(xì)表大小不固定,單行合同數(shù)據(jù)的明細(xì)表中只有一條記錄而多行合同數(shù)據(jù)的明細(xì)表中有多條記錄。系統(tǒng)要針對(duì)不同類(lèi)型的合同數(shù)據(jù)進(jìn)行分別處理。
3 標(biāo)準(zhǔn)合同生成過(guò)程
3.1 Word標(biāo)準(zhǔn)合同模板制定
使用合同生成系統(tǒng)之前,需要準(zhǔn)備Excel數(shù)據(jù)文件和Word標(biāo)準(zhǔn)合同模板文件。
Excel數(shù)據(jù)文件直接從ERP數(shù)據(jù)庫(kù)中導(dǎo)出。
Word標(biāo)準(zhǔn)合同模板中包含2種性質(zhì)的文字:固定不變的內(nèi)容,即每份合同都相同的部分,例如合同中的法律聲明、甲方聯(lián)系人、甲方單位地址等文字信息;以及發(fā)生變化的內(nèi)容,例如合同中的產(chǎn)品名稱、產(chǎn)品價(jià)格等信息,這些變化內(nèi)容來(lái)自于Excel數(shù)據(jù)文件,每份合同都不相同。對(duì)于可變的內(nèi)容用統(tǒng)一格式的字符串填寫(xiě),該字符串本質(zhì)上起到占位符的作用,在自動(dòng)填入信息時(shí)有助于查找和替換操作。它由2部分組成,第一是不會(huì)引起歧義的前后綴;第二是被前后綴圍堵的部分,用來(lái)說(shuō)明被替換的內(nèi)容在Excel數(shù)據(jù)文檔中的列名稱。例如”au-togen工程項(xiàng)目autogen“字符串表示應(yīng)該用Excel數(shù)據(jù)文檔中名稱為”工程項(xiàng)目“的列所對(duì)應(yīng)的內(nèi)容來(lái)替換此處的字符串,添加前后綴”autogen“可以避免與合同的其他固定內(nèi)容沖突,不會(huì)導(dǎo)致錯(cuò)誤替換。當(dāng)然,對(duì)Word文檔進(jìn)行定位可采用的技術(shù)還包括書(shū)簽定位、域定位等[3-10],但不如直接填寫(xiě)查找字符串方便,比較適合標(biāo)準(zhǔn)模板的編寫(xiě)人員所采用。
另外,對(duì)于合同模板中的”明細(xì)表“,其中要填寫(xiě)的記錄數(shù)量不固定,不能用查找和替換方式寫(xiě)入合同,對(duì)此采用了動(dòng)態(tài)處理的辦法,在程序中根據(jù)具體的明細(xì)數(shù)據(jù)行數(shù)向明細(xì)表填寫(xiě)數(shù)據(jù)。
Word 標(biāo)準(zhǔn)合同模板的準(zhǔn)備工作比較復(fù)雜,但是該模板一般不會(huì)發(fā)生變化。如果必須修改標(biāo)準(zhǔn)合同模板,模板修改只需修改固定內(nèi)容或添加/刪除可變內(nèi)容的替換字符串即可。
3.2 自動(dòng)生成Word標(biāo)準(zhǔn)合同
自動(dòng)生成Word標(biāo)準(zhǔn)合同的算法如圖2所示。大致可以分為4個(gè)步驟:
(1)把Excel數(shù)據(jù)文件中的信息讀取到DataSet數(shù)據(jù)集合內(nèi);
(2)檢查DataSet中的當(dāng)前行數(shù)據(jù)是否為新合同數(shù)據(jù)的開(kāi)始,即合同首行數(shù)據(jù),如果存在該行數(shù)據(jù)則打開(kāi)Word合同模板,采用逐項(xiàng)查找-替換或查找-修改-替換的方法填充合同模板中的可變數(shù)據(jù);如果該行數(shù)據(jù)不存在,則說(shuō)明已經(jīng)處理至數(shù)據(jù)文件末尾,退出程序;
(3)檢查該份合同是否有明細(xì)項(xiàng)(行),如果有則采用循環(huán)的方式逐行把明細(xì)項(xiàng)填入Word模板中的”明細(xì)表“,如果沒(méi)有則直接把合同數(shù)據(jù)首行寫(xiě)入該表。
(4)保存按模板生成的合同,然后返回到步驟(2)。
在步驟(2),(3)中如果讀取到的數(shù)據(jù)無(wú)效,則當(dāng)前的合同文件生成立即終止,并把無(wú)效數(shù)據(jù)出現(xiàn)的位置向用戶報(bào)告,計(jì)算下一份合同的開(kāi)始位置,從步驟(2)繼續(xù)運(yùn)行。
4 標(biāo)準(zhǔn)合同生成技術(shù)的實(shí)際應(yīng)用
基于COM組件的合同文本自動(dòng)生成系統(tǒng)在陜西省電力物資公司進(jìn)行了實(shí)際應(yīng)用。操作人員輸入Excel合同數(shù)據(jù)文件和標(biāo)準(zhǔn)合同模板文件后,程序?qū)⒏鶕?jù)數(shù)據(jù)文件的內(nèi)容逐份生成合同文檔,如圖3所示。若某個(gè)合同數(shù)據(jù)出現(xiàn)錯(cuò)誤,則報(bào)告該錯(cuò)誤所在數(shù)據(jù)文件的行號(hào)和字段,終止生成該合同,并繼續(xù)處理后續(xù)合同數(shù)據(jù)。從只有幾份合同數(shù)據(jù)到數(shù)百份合同數(shù)據(jù)的Excel文件,整個(gè)自動(dòng)生成過(guò)程需要數(shù)秒到數(shù)十秒時(shí)間。如果全由人工編寫(xiě)合同文檔,少則需要數(shù)小時(shí)時(shí)間錄入、校對(duì),多則需要數(shù)天時(shí)間。該系統(tǒng)的應(yīng)用把操作員從繁重手工作業(yè)中解放出來(lái),避免了手工操作所帶來(lái)的遺漏和錯(cuò)誤,使合同文檔的生成工作更加標(biāo)準(zhǔn)化、規(guī)范化,大大提高了工作效率。
5 結(jié)語(yǔ)
本文在基于COM組件技術(shù)對(duì)Excel和Word操作支持的基礎(chǔ)上,提出了自動(dòng)生成Word格式合同文檔的方法,并根據(jù)該方法實(shí)現(xiàn)了合同文檔自動(dòng)生成系統(tǒng)。在陜西省電力物資公司的實(shí)際應(yīng)用中,驗(yàn)證了這種技術(shù)的可行性和高效性。
但是,系統(tǒng)仍有一些不足之處,還存在以下幾方面的后續(xù)研發(fā)工作:Word合同模板中動(dòng)態(tài)內(nèi)容的增減仍要靠人工打開(kāi)Word文檔增刪占位字符串,應(yīng)能提供更好的人機(jī)界面,通過(guò)鼠標(biāo)拖拽的方式從Excel數(shù)據(jù)文件中選擇出Word合同模板所需的占位字符串。從而提高模板制作的自動(dòng)化程度,減少人為操作失誤;標(biāo)準(zhǔn)化合同模板的規(guī)范化問(wèn)題,合同模板的規(guī)格和標(biāo)準(zhǔn)越規(guī)范,利用計(jì)算機(jī)技術(shù)進(jìn)行自動(dòng)化處理的程度就越高;該軟件系統(tǒng)能否自動(dòng)生成其他類(lèi)型的文件,即能否提高它的抽象性和通用性問(wèn)題。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7293瀏覽量
93377 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7721瀏覽量
92264 -
人機(jī)界面
+關(guān)注
關(guān)注
5文章
549瀏覽量
45326
發(fā)布評(píng)論請(qǐng)先 登錄
labview COM組件在客戶機(jī)如何實(shí)現(xiàn)自動(dòng)注冊(cè)?
labvIEW調(diào)用matlab生成的COM組件
LabView調(diào)用com組件的問(wèn)題。
合同智能審查技術(shù)促進(jìn)智能金融發(fā)展
基于模型設(shè)計(jì)的HDL代碼自動(dòng)生成技術(shù)綜述
自動(dòng)生成特定偽碼的設(shè)計(jì)與實(shí)現(xiàn)
基于COM技術(shù)的濕地信息系統(tǒng)設(shè)計(jì)
基于COM技術(shù)的串口通信組件的設(shè)計(jì)
JAVA中基于JACOB的COM組件調(diào)用研究
基于COM組件的插件平臺(tái)技術(shù)研究

智能變電站SCD文件虛回路自動(dòng)生成技術(shù)的設(shè)計(jì)和實(shí)現(xiàn)

英創(chuàng)信息技術(shù)利用COM組件遠(yuǎn)程更改設(shè)備配置文件的流程

組合邏輯自動(dòng)測(cè)試生成的PDF文件免費(fèi)下載

評(píng)論