1. 程式人生 > >C# 調用word進程操作文檔關閉進程

C# 調用word進程操作文檔關閉進程

proc 方案 rac close mis oa系統 參考資料 解決 ring

C# 調用word進程操作文檔關閉進程

作者:鄧家海

時間:2018-02-12 20:36:23

前言:

office辦公軟件作為現在主流的一款辦公軟件,在我們的日常生活和日常工作裏面幾乎每天都要用到。到了今天,為了節省人力資源和減輕工作量,減少工作上面的錯誤以及減輕工作的復雜度,於是辦公自動應運而生。於是出現了OA軟件的春天,許多政府機關、單位、企業都會選擇采購或者定制OA系統。OA軟件普遍都涉及到office辦公軟件的操作。Excel、word是經常用到的。

拋出問題

案例:在為某政府機關研發一個管理系統,該政府機關有大量的合同需要處理,包括合同填寫、審閱、呈批、保存、後期管理等一系列問題。而且工作量非常大,於是該政府決定定制一個合同管理的模塊。該管理系統主要涉及到word的復制、編輯、保存等操作。前臺是使用了第三方控件。但是我們的後臺服務器也要進行文件的復制,打開替換等操作。需要在服務器調用word進程。由於調用了word進程管理不當,導致進程每次操作都新增一個,進程多到一定的程度之後,就導致服務器崩潰。

技術分享圖片

程序後臺調用word

設置word 可以被程序調用,其實就是權限問題,這個一般要設置服務器的用戶和netword用戶。到com組件裏面設置。

操作word

1.

Microsoft.Office.Interop.Word._Application wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();  //新建對象,會產生一個新的word進程



2.

var wordDoc =wordApp.Documents.Open(ref filename)//打開word文檔

3.

wordDoc.AcceptAllRevisions(); //接收word中所有的修訂
wordDoc.Save();//保存
wordDoc.Close(ref missing, ref missing, ref missing);  //關閉word文檔



執行上面三步,你會發現,這三個代碼每執行一次,產生一個word進程。直至服務器資源耗盡崩潰!

管理word進程

解決方案:

1.

對Word._Application對象進行退出,這是最基本的,也是必須的。

wordApp.Application.Quit(ref saveOption, ref
missing, ref missing);



2.倘若退出,進程還是存在,為了保險起見,我們還可以對進程進行kill。

//殺死打開的word進程
 Process myProcess = new Process();
 Process[] wordProcess = Process.GetProcessesByName("winword");

但是這裏有一個問題,就是會誤殺別的地方調用的進程。下面就可以殺死屬於自己的進程。

foreach (Process pro in wordProcess) //這裏是找到那些沒有界面的Word進程
{
        IntPtr ip= pro.MainWindowHandle;

         string str =pro.MainWindowTitle; //發現程序中打開跟用戶自己打開的區別就在這個屬性
       //用戶打開的str 是文件的名稱,程序中打開的就是空字符串
         if (str==文件名)
           {
                  pro.Kill();
           }
           }


其實上面還有一個地方可以優化,存在現有的進程,不創建新的進程。

A程序叫B程序關閉,B程序有沒有關閉是不可控的。

如果word都是new出來的,那麽會有越來越多的word進程。使用get的方式,保證只有一個word進程。

try 

 { 

       this.app = (Application)Microsoft.VisualBasic.Interaction.GetObject(null, "Word.Application");  }  catch { 

                this.app = new Application();             

} 

參考資料和文獻

C# 調用word進程操作文檔關閉進程