国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 編程設計 > 正文

Excel Services OverView系列3 使用Excel Web Services操作Excel工作薄

2020-06-27 14:44:59
字體:
來源:轉載
供稿:網友

Excel Web Services(以后簡稱EWS)位于整個Excel Services的前端(可以參考我之前的文章)。它提供了開發Excel的接口。從名字可以看出,EWS也屬于WebService的一種,所以我們可以像使用普通的WebService那樣使用它。要想調用EWS,先要知道它的地址,這取決于MOSS的設置。假如MOSS的名稱為ServerName,那么對應的EWS地址就是: http://<server name>/_vti_bin/ExcelService.asmx .在瀏覽器中輸入EWS地址后您會看到下圖:

Excel,Web,Services,Excel工作薄

話不多說,現在進入今天的主題,我將通過一個程序為您演示如何使用EWS.

本次程序依然會使用上一篇文章里創建的Excel文檔。程序運行后首先讀取SharePoint Server上的Excel工作薄,將A1至B3的單元格內容顯示到程序界面;也可以修改文本框中的內容,然后點擊“計算”按鈕,對應的標簽會顯示更新結果;或者點擊保存,將服務器上的Excel工作薄保存到本地。

Excel,Web,Services,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.GetCell(workbookPath,”sheet1”,0,0,true,out status);

 

取值完畢后還需要關閉工作薄,以便釋放資源,減輕服務器負擔
es.CloseWorkbook(sessionID)
 
       取值部分已經介紹完了,看一下完整代碼:
      

復制代碼
代碼如下:

string workbookPath = @"http://vistaserver/dc/ExcelServiceTest/test.xlsx";
string cultrueInfo = "zh-cn";
Status[] status;
/// <summary>
/// 從服務器上的excel文檔中取值
/// </summary>
void GetValueFromServer()
{</p> <p> ExcelService es = new ExcelService();
es.Credentials = System.Net.CredentialCache.DefaultCredentials;
string sessionID = es.OpenWorkbook(workbookPath, cultrueInfo, cultrueInfo, out status);

A1Field.Text = es.GetCellA1(sessionID, "sheet1", "A1", true, out status).ToString();
A2Field.Text = es.GetCellA1(sessionID, "sheet1", "A2", true, out status).ToString();
A3Field.Text = es.GetCellA1(sessionID, "sheet1", "A3", true, out status).ToString();

number1.Text = es.GetCellA1(sessionID, "sheet1", "B1", true, out status).ToString();
number2.Text = es.GetCellA1(sessionID, "sheet1", "B2", true, out status).ToString();
result.Text = es.GetCellA1(sessionID, "sheet1", "B3", true, out status).ToString();
es.CloseWorkbook(sessionID);
}

 
2.賦值:
ExcelService類中對單元格賦值的方法為SetCellA1(還有SetCell,使用方法可以參考GetCell)。該方法的函數聲明如下
Status status=SetCellA1(string sessionID,string sheetName,string rangeName,object cellValue)
   看一下計算部分的完整代碼:

 

  

復制代碼
代碼如下:

ExcelService es = new ExcelService();
es.Credentials = System.Net.CredentialCache.DefaultCredentials;
string sessionID = es.OpenWorkbook(workbookPath, cultrueInfo, cultrueInfo, out status);

es.SetCellA1(sessionID, "sheet1", "B1", number1.Text);
es.SetCellA1(sessionID, "sheet1", "B2", number2.Text);
result.Text = es.GetCellA1(sessionID, "sheet1", "B3", true, out status);

 

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是一個枚舉類型:

 

復制代碼
代碼如下:

public enum WorkbookType
{
FullWorkbook,

FullSnapshot,

PublishedItemsSnapshot,
}

 

FullWorkbook功能最強大,可以獲得服務器上完整的工作薄(所有的sheet)
FullSnapshot和FullWorkbook類似,也可以獲得完整的工作薄快照
PublishedItemsSnapshot功能最弱,只能獲得作者允許查看的的工作薄的快照(還記得上一篇文章里提到的”ExcelService選項”嗎)
 看到這里,大家可能有點疑惑:只要設置了FullWorkbook或FullSnapshot就可以獲得完整的工作薄,那作者在發布Excel時進行的工作不就沒用了嗎?呵呵,實際上并不是任何人(或者說任何情況下)都可以使用FullWorkbook/FullSnapshot的。記得之前我提到的“憑證”嗎? 只有提供了足夠的權限的憑證才可以使用。
再來說說“完整工作薄”和“快照”的區別。可以將快照理解為前者的子集。但快照不能使用創建者在工作薄中輸入的公式,并且不能使用外部數據連接。
 Ok,GetWorkbook方法介紹完畢,看一下程序代碼。

 

復制代碼
代碼如下:

byte[] content = es.GetWorkbook(sessionID, WorkbookType.PublishedItemsSnapshot, out status);

es.CloseWorkbook(sessionID);

FileStream fs = new FileStream("c://test.xlsx", FileMode.Create);
fs.Write(content, 0, content.Length);
fs.Flush();
fs.Close();

 

   現在,程序的整體功能已經完成了。希望能對大家有所幫助。
    我只介紹了Excel Web Service的基本使用方法,本想在程序里添加更多的功能,全面介紹一下Excel Web Service中的方法。但我實在不知道如何表達出來:(  我將在一篇文章中為大家介紹user-defined functions (UDFs). 再次感謝大家瀏覽。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹤岗市| 鄄城县| 扎赉特旗| 荔浦县| 阳原县| 阿勒泰市| 合阳县| 句容市| 达尔| 怀集县| 松溪县| 上高县| 南京市| 昭通市| 牡丹江市| 蕉岭县| 青河县| 永清县| 交口县| 仪征市| 潜江市| 江城| 峨山| 乡城县| 上犹县| 五指山市| 志丹县| 长海县| 涿州市| 凤山市| 永州市| 和林格尔县| 扬州市| 游戏| 河间市| 惠水县| 本溪| 新邵县| 西乌| 扬州市| 拉萨市|