引言
伴隨計算機和網絡技術的飛速發展,電力企業大規模開展了信息網絡的建設和信息系統的開發,信息技術的應用領域已經深入到電網生產、經營和管理的各個環節。電力物資公司作為電力系統的物資專營企業,主要承擔著電力設備的招標、訂貨和采購工作,日常業務需要處理大量的合同數據。
目前物資合同數據來自于電系統的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合同模板所需的占位字符串。從而提高模板制作的自動化程度,減少人為操作失誤;標準化合同模板的規范化問題,合同模板的規格和標準越規范,利用計算機技術進行自動化處理的程度就越高;該軟件系統能否自動生成其他類型的文件,即能否提高它的抽象性和通用性問題。
-
數據
+關注
關注
8文章
7220瀏覽量
89955 -
計算機
+關注
關注
19文章
7566瀏覽量
88878 -
人機界面
+關注
關注
5文章
535瀏覽量
44304
發布評論請先 登錄
相關推薦
labview COM組件在客戶機如何實現自動注冊?
labvIEW調用matlab生成的COM組件
合同智能審查技術促進智能金融發展
基于模型設計的HDL代碼自動生成技術綜述
基于COM技術的濕地信息系統設計
基于COM技術的串口通信組件的設計
基于COM組件的插件平臺技術研究

組合邏輯自動測試生成的PDF文件免費下載

評論