欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2023-11-20 19:23:52
Excel Services OverView系列3 使用Excel Web Services操作Excel工作薄...

excel web services(以后简称ews)位于整个excel services的前端(可以参考我之前的文章)。它提供了开发excel的接口。从名字可以看出,ews也属于webservice的一种,所以我们可以像使用普通的webservice那样使用它。要想调用ews,先要知道它的地址,这取决于moss的设置。假如moss的名称为servername,那么对应的ews地址就是: http://<server name>/_vti_bin/excelservice.asmx .在浏览器中输入ews地址后您会看到下图:

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

话不多说,现在进入今天的主题,我将通过一个程序为您演示如何使用ews.

本次程序依然會使用上一篇文章里创建的excel文档。程序运行后首先读取sharepoint server上的excel工作薄,将a1至b3的单元格内容显示到程序界面;也可以修改文本框中的内容,然后点击“计算”按钮,对应的标签会显示更新结果;或者点击保存,将服务器上的excel工作薄保存到本地。

Excel Services OverView系列3 使用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.closeworkbook(sessionid)
 
       取值部分已经介绍完了,看一下完整代碼:
      
代码如下:
 
2.赋值:
excelservice类中对单元格赋值的方法为setcella1(还有setcell,使用方法可以参考getcell)。该方法的函数声明如下
status status=setcella1(string sessionid,string sheetname,string rangename,object cellvalue)
   看一下计算部分的完整代码:

  
代码如下:

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功能最强大,可以获得服务器上完整的工作薄(所有的sheet)
fullsnapshot和fullworkbook类似,也可以获得完整的工作薄快照
publisheditemssnapshot功能最弱,只能获得作者允许查看的的工作薄的快照(还记得上一篇文章里提到的”excelservice选项”吗)
 看到这里,大家可能有点疑惑:只要设置了fullworkbook或fullsnapshot就可以获得完整的工作薄,那作者在发布excel时进行的工作不就没用了吗?呵呵,实际上并不是任何人(或者说任何情况下)都可以使用fullworkbook/fullsnapshot的。记得之前我提到的“凭证”吗? 只有提供了足够的权限的凭证才可以使用。
再来说说“完整工作薄”和“快照”的区别。可以将快照理解为前者的子集。但快照不能使用创建者在工作薄中输入的公式,并且不能使用外部数据连接。
 ok,getworkbook方法介绍完毕,看一下程序代码。


代码如下:

   现在,程序的整体功能已经完成了。希望能对大家有所帮助。
    我只介绍了excel web service的基本使用方法,本想在程序里添加更多的功能,全面介绍一下excel web service中的方法。但我实在不知道如何表达出来:(  我将在一篇文章中为大家介绍user-defined functions (udfs). 再次感谢大家浏览。