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

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

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

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

評論