Excel Web Services(以后簡稱EWS)位于整個Excel Services的前端(可以參考我之前的文章)。它提供了開發Excel的接口。從名字可以看出,EWS也屬于WebService的一種,所以我們可以像使用普通的WebService那樣使用它。要想調用EWS,先要知道它的地址,這取決于MOSS的設置。假如MOSS的名稱為ServerName,那么對應的EWS地址就是: http://<server name>/_vti_bin/ExcelService.asmx .在瀏覽器中輸入EWS地址后您會看到下圖:
話不多說,現在進入今天的主題,我將通過一個程序為您演示如何使用EWS.
本次程序依然會使用上一篇文章里創建的Excel文檔。程序運行后首先讀取SharePoint Server上的Excel工作薄,將A1至B3的單元格內容顯示到程序界面;也可以修改文本框中的內容,然后點擊“計算”按鈕,對應的標簽會顯示更新結果;或者點擊保存,將服務器上的Excel工作薄保存到本地。
現在開始創建應用程序。首先建立一個名為ExcelWebServcice的Windows應用程序,將剛才EWS引用到程序里,將命名空間改為ExcelWebServcice
添加完引用以后就可以使用該服務了。
整個程序分為3部分:
1、取值 ;
2、賦值 ;
3、保存 。
1.取值 :
將EWS添加到工程后,可以看見ExcelWebService命名空間下出現了ExcelService類。通過操作它就可以完成與服務器端的交互。
首先將其實例化
ExcelService es=new ExcelService();
在調用ExcelService前必須為其指定憑證(Credential),否則應用程序會拋出異常。憑證可以是默認憑證或使用指定了用戶名/密碼的憑證,這里我們使用默認憑證。兩者的區別將在后文討論。
es.Credentials = System.Net.CredentialCache.DefaultCredentials;
es.Credentials = new System.Net.NetworkCredential("userName", "password","domain");
設置憑證以后我們執行OpenWorkbook,該方法的函數聲明如下:
string ExcelService.OpenWorkbook(string workbookPath, string cultrueInfo,string cultrueInfo,string out status)
OpenWorkbook用于打開Excel,workbookPath表示文件在服務器中的地址。cultureInfo,cultureInfo是區域信息,這里我們填寫”zh-cn”(代表中文)。最后一個參數有點特殊,是個Status類型的數組,用于存儲錯誤信息。在執行ExcelService的方法時可能會發生錯誤。嚴重的錯誤會引起程序崩潰,而輕微的錯誤并不影響程序的運行,系統會將錯誤信息儲存在Status類型的數組中。值得注意的是ExcelService類中的所有方法都涉及了該參數。
最后介紹一下該方法的返回值:執行Openworkbook后,Excel Calculation Server會產生一個會話。會話編號就存儲在OpenWorkbook的返回值內。
順利執行OpenWorkbook后就可以從Excel取值了。我們需要從文檔的sheet1的第一個單元格取值,也就是從A1單元格中取值。可以使用GetCellA1方法.
object GetCellA1(string sessionID,string sheetName,string rangeName,bool formatted,out Status[] status)
GetCellA1方法需要會話的編號,去定從哪個會話的Excel工作薄中取值;參數sheetName確定從哪個sheet中取值;參數rangeName確定從哪個單元格中取值;參數formatted表示取值時是否保留格式;
看到這里您可能會有些疑問:GetCell和GetCellA1有什么區別呢?A1有什么含義?
實際上GetCellA1方法中的A1代表Excel的命名規則。例如您在Excel中的某個單元格內輸入”=A1”或者” =Sheet1!$A$1” ,表示該單元格引用了A1單元格的值,僅此而已。
Excel Calculation Service還支持另外一種規則:通過坐標系取/賦值。這種規則對應GetCell方法。只不過現在的坐標系起始值是0,不是Excel中的1。所以我們代碼應該如下:
取值完畢后還需要關閉工作薄,以便釋放資源,減輕服務器負擔
es.CloseWorkbook(sessionID)
取值部分已經介紹完了,看一下完整代碼:
3.保存
您可能注意到了,“賦值”部分的代碼缺少了CloseWorkbook方法。其原因可以從上文中聯想到:Excel Calculation Service負責維護會話,這樣可以保證多個用戶使用Excel Calculation Service時不會相互影響。所以關閉了工作薄會導致會話也被關閉,之前在會話中對Excel所作的操作也將丟失… 所以,保存操作要在關閉會話前完成。
現在看一下獲取Excel工作薄的方法:
byte[] GetWorkbook(string sessionID,WorkbookType workbookType,out Status[] status)
GetWorkbook從服務器端獲取Excel工作薄,將其以byte數組的形式返回。該方法包含3個參數。想必大家對參數sessionID和status的用法比較熟悉了,這里我著重講解以下WrokbookType的含義。
WorkbookType是一個枚舉類型:
FullWorkbook功能最強大,可以獲得服務器上完整的工作?。ㄋ械膕heet)
FullSnapshot和FullWorkbook類似,也可以獲得完整的工作薄快照
PublishedItemsSnapshot功能最弱,只能獲得作者允許查看的的工作薄的快照(還記得上一篇文章里提到的”ExcelService選項”嗎)
看到這里,大家可能有點疑惑:只要設置了FullWorkbook或FullSnapshot就可以獲得完整的工作薄,那作者在發布Excel時進行的工作不就沒用了嗎?呵呵,實際上并不是任何人(或者說任何情況下)都可以使用FullWorkbook/FullSnapshot的。記得之前我提到的“憑證”嗎? 只有提供了足夠的權限的憑證才可以使用。
再來說說“完整工作薄”和“快照”的區別??梢詫⒖煺绽斫鉃榍罢叩淖蛹?。但快照不能使用創建者在工作薄中輸入的公式,并且不能使用外部數據連接。
Ok,GetWorkbook方法介紹完畢,看一下程序代碼。
現在,程序的整體功能已經完成了。希望能對大家有所幫助。
我只介紹了Excel Web Service的基本使用方法,本想在程序里添加更多的功能,全面介紹一下Excel Web Service中的方法。但我實在不知道如何表達出來:( 我將在一篇文章中為大家介紹user-defined functions (UDFs). 再次感謝大家瀏覽。
新聞熱點
疑難解答