Office的文檔處理能力是非常強大的,但是它是本地資源,在Office Web App尚未成熟前,仍需要使用本地能力來進行文檔編輯,可是現代的系統的主流卻是B/S,所以在B/S中調用本地的Office編輯的能力就非常重要。
目前還說,將Office編輯的能力與B/S結合起來的方法主流的方案有三種:
DsoFarmer OCX嵌入網頁在線編輯方案:在很多年前微軟發布了一段C++開發源代碼的OCX控件DsoFarmer,可以將嵌入到網頁上使用JAVASCRIPT進行交互,該控件可以使用本地的OFFICE能力實現在線的交互。該方案被眾多OA廠商采用,我現在開發的OA就是使用該方案進行Office文檔的在線處理。
使用Office Web App實現在線編輯方案:該方案是從2011 SharePoint中自帶的一種方式,后經過微軟改良后做為單獨的服務Office Web App來使用,它可以與微軟的產品,SharePoint,OneDriver,Exchange或第三方協同工作,但是經過實踐證實,如果需要使用訪方案讓自己第三方系統擁有在線編輯Office的能力,需要安裝SharePoint2013及以上版本,另外需要獨立的服務器,因為OWA是不能和其它第三方系統使用同一台服務器的。
使用WebDAV編輯方案:該方案實際是不是在線編輯,而是通過WebDAV協議進行交互,而IIS和OFFICE都實現了WebDAV的交互能力,所以能有了這個交互方案。該方案主要是通過在Web Server端配置WebDAV后直接使用Office編輯,它會自動通過SharePoint Workspace(安裝OFFICE時會自動安裝)進行WebDAV的謂語動作。本章就着重講解如何使用WebDAV進行Office編輯的方法。
操作系統:Windows 2008 R2
客戶端:Win7/Win8、IE7 、Office2010
首先需要配置操作系統,安裝WebDAV組件,默認Windows 2008 R2是不安裝的。我們需要安裝它,如圖所示:
安裝完成后在站點中使會多出WebDAV創做功能,該功能默認是關閉的,我們需要雙擊進去后打開它,如圖所示:
添加WebDAV的規則,因為我們是做測試,先不考慮其它所以先將其配置為全部可以訪問,如果所示
接下來我們配置安全性,我們關掉默認的匿名訪問,而開啟Windows的訪問。
我們這里使用的是Windows帳號登陸,但是原來我的系統上的用戶都是在存在數據庫里的,我就寫了個程序自動同步數據庫里的用戶到Windows賬戶。我使用的是ASP.NET語言,所以我的程序要做一些改造,來適應該變化,代碼如下:
public class UserManager { public UserManager() { } /**/ /// <summary> /// 創建IIS登錄帳號 /// </summary> /// <param name="userName">登錄帳號</param> /// <returns></returns> public static bool CreateUser(string userName, string password) { try { DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntry NewUser = AD.Children.Add(userName, "user");//增加用戶名 NewUser.Invoke("SetPassword", new object[] { password });//用戶密碼 NewUser.Invoke("Put", new object[] { "FullName", userName });//用戶全稱 NewUser.Invoke("Put", new object[] { "Description", password });//用戶詳細描述 NewUser.Invoke("Put", "PasswordExpired", 0);//用戶下次登錄需更改密碼 NewUser.Invoke("Put", "UserFlags", 66049);//密碼永不過期 //NewUser.Invoke("Put", "HomeDirectory", Path); //主文件夾路徑 //NewUser.Properties["UserFlags"].Add(0x0002);//禁用登錄帳號 //NewUser.Properties["UserFlags"].Add(0x0040);//用戶不能更改密碼 ArrayList arl = new ArrayList(); arl.Add(0x0002); arl.Add(0x0040); arl.Add(0x10000); NewUser.Properties["UserFlags"].Value = arl.ToArray(); //NewUser.Properties["UserFlags"].Add(0x10000);//用戶密碼永不到期 NewUser.CommitChanges(); DirectoryEntry ObjUser = AD.Children.Find("FarseeingSoftUsers", "group"); if (ObjUser.Name != null) { ObjUser.Invoke("Add", new object[] { NewUser.Path.ToString() }); } ObjUser.Close(); AD.Close(); return true; } catch { return false; } } /**/ /// <summary> /// 修改IIS登錄帳號密碼 /// </summary> /// <param name="userName">登錄帳號</param> /// <param name="password">登錄密碼</param> /// <returns></returns> public static bool EditUser(string userName, string password) { try { DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntry ObjUser = AD.Children.Find(userName, "user"); ObjUser.Invoke("SetPassword", password); ObjUser.CommitChanges(); ObjUser.Close(); AD.Close(); return true; } catch { return false; } } /**/ /// <summary> /// 刪除IIS登錄帳號 /// </summary> /// <param name="userName">登錄帳號</param> /// <returns></returns> public static bool DelUser(string userName) { try { DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntry ObjUser = AD.Children.Find(userName, "user");//找得用戶 AD.Children.Remove(ObjUser);//刪除用戶 ObjUser.GetType(); ObjUser.Close(); AD.Close(); return true; } catch { return false; } } }
通過簡單的配置和程序改造句到此我們的服務器就支持了WebDAV,我們可以在站點里放一個Office的文檔,比如一個word文件,然后用Office打開,輸入該網址,然后輸入用戶名密碼試一下,如圖所示
此時我們會發現,保存變成了這個圖標:
點擊保存后,再到服務器端看看該文件,是不是已經被改變了。
到目前為之還是需要讓用戶知道我們的文件地址,然后用WORD打開,這很明顯是不現實的,接下來我們需要改造我們的頁面,以便讓用戶可以在網頁上點擊文件的連接自動打開OFFICE進行編輯。我們需要為頁面增加如下腳本:
var contextPath = "/"; //測試時可以傳入固定值office文件相對根目錄路徑 function fnWebDAVFile(szPath) { try { "undefined" == typeof contextPath && (contextPath = ''); if (!fnWebDAVFile.oSharePoint) { // 操作系統必須安裝Office和其SharePoint組件才能使用,默認已經安裝 try { fnWebDAVFile.oSharePoint = new ActiveXObject("SharePoint.OpenDocuments.3") } catch (e) { try { fnWebDAVFile.oSharePoint = new ActiveXObject("SharePoint.OpenDocuments.2") } catch (e) { try { fnWebDAVFile.oSharePoint = new ActiveXObject("SharePoint.OpenDocuments.1") } catch (e) { alert("你沒有安裝Office的SharePoint.OpenDocuments組件"); } } } } var o = fnWebDAVFile.oSharePoint, l = window.location, szPath = contextPath + szPath; //此處產生路徑 o.editDocument(szPath); } catch (e) { alert(e.message) } }
在頁面中我們可以將鏈接改造成為:<a href=”javascript:fnWebDAVFile(文件URL)”>文件名</a>
測試一下頁面會是如下的效果,點擊修改按鈕:
會提示如下的警告框:
點擊確定后輸入您的WINDOWS帳號,即上面我們通過將數據庫中的用戶同步到WINDOWS帳號中的用戶名密碼,即可以進行編輯。
如果不希望顯示該警告框的話,需要在客戶端的IE地址中,將當前的域名加入到受信站點中,一般企業會用AD進行策略推送,如果您的公司沒有AD,那就只能跑到每台電腦前進行設置了。設置方法如下:
到此,就可以實現從B/S系統的網頁中通過點擊文件連接實現調用OFFICE文件,通過WebDAV進行編輯保存了。
由於介紹本技術的相關內容的網站資源並不多,而且沒有一個完整的教程,在實踐過程中本人遇到了大量的問題,走了很多彎路,希望通過該文章幫助大家少走彎路,如果在實踐過程中遇到什么問題,歡迎加QQ:9808175進行交流。
關於前面提到的DsoFarmer OCX嵌入網頁在線編輯方案和Office Web App實現在線編輯方案兩種解決方案,我想抽時間寫一些文章將最佳實踐放上來分享給大家!