MSDN Visual系列:从Excel Services获取一个工作簿或快照

it2022-05-05  61

原文: http://msdn2.microsoft.com/en-us/library/bb397370.aspx  如果我们要把创作完工作簿文件副本存放在某处,然后发送给某人,那么最好的方式就是使用Excel Web Services。通过Excel Web Services我们可以得到一个工作簿或一个快照。当用户或应用程序请求一个快照时,Excel Services会在服务器端打开Excel文件,刷新数据源,并计算所有Excel公式,最后生成并通过Web服务API发送回一个快照。

下面的例子展示了如何在Excel Web Services中获取:整个工作簿,一个整个文件的快照,或一个文件内某个工作表或对象的可视范围的快照。

在Excel Web Services中用GetWorkbook方法得到整个工作簿或某个类型的快照。

获取快照

下面的代码会返回整个Excek工作簿的一个快照。其中使用WorkbookType.FullSnapshot枚举作为GetWorkbook方法的第二个参数。

byte [] workbook  =  xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot,  out  status);   GetWorkbook 方法返回一个字节数组,与载入到会话 中的 Excel 文件的格式相同。

获取可视项的一个快照

 如果要获取当保存工作薄到服务器上时Excel工作簿作者所选取的可视区域的一个快照,可以使用WorkbookType.PublishedItemsSnapshot 枚举值。如下:

byte [] workbook  =  xlService.GetWorkbook(sessionId, WorkbookType.PublishedItemsSnapshot,  out  status);

获取整个工作簿

如果要获取整个工作簿在当前会话状态(session state)下的快照,可以使用WorkbookType.FullWorkbook 枚举值。

byte [] workbook  =  xlService.GetWorkbook(sessionId, WorkbookType.FullWorkbook,  out  status);

WorkbookType.FullWorkbook 和 WorkbookType.FullSnapshot 选项只有在当前用户具有文件的打开权限是才有效。如果用户是只读权限,调用就会失败。

完整的代码

下面的命令行程序接受一个命令行参数,即服务器上工作簿的路径。程序会调用Web服务打开该工作簿并获取一个快照,然后将其write到标准输出上。这样我们将其重定向到一个新的快照文件。

using  System; using  System.IO; using  System.Text; using  System.Web.Services.Protocols; //  TODO: Change the using GetSnapshot.ExcelWebService; directive  //  to point to the Web service you are referencing. using   //  GetSnapshot.ExcelWebService; namespace  GetSnapshot{     class  ExcelServicesSnapshot    {         static   void  Main( string [] args)        {             try             {                 if  (args.Length  <   1 )                {                    Console.Error.WriteLine( " Command line arguments should be:                      GetSnapshot [workbook_path]  >  [snapshot_filename] " );                      return ;                }                 //  Instantiate the Web service and                  //  create a status array object.                 ExcelService xlService  =   new  ExcelService();                Status[] status;                                xlService.Timeout  =   600000 ;                 //  Set credentials for requests.                 //  Use the current user's logon credentials.                 xlService.Credentials  =                    System.Net.CredentialCache.DefaultCredentials;                                  //  Open the workbook, then call GetWorkbook                  //  and close the session.                  string  sessionId  =  xlService.OpenWorkbook(args[ 0 ],                  " en-US " " en-US " out  status);                 byte [] workbook  =  xlService.GetWorkbook                (sessionId, WorkbookType.PublishedItemsSnapshot,                   out  status);                 //  byte[] workbook = xlService.GetWorkbook(sessionId,                  //  WorkbookType.FullWorkbook, out status);                 //  byte[] workbook = xlService.GetWorkbook(sessionId,                  //  WorkbookType.FullSnapshot, out status);                 //  Close the workbook. This also closes the session,                      //  proactively releasing resources on the server.                  status  =  xlService.CloseWorkbook(sessionId);                 //  Write the resulting Excel file to stdout                  //  as a binary stream.                 BinaryWriter binaryWriter  =   new  BinaryWriter                (Console.OpenStandardOutput());                binaryWriter.Write(workbook);                binaryWriter.Close();            }             catch  (SoapException e)            {                Console.WriteLine( " SOAP Exception Message: {0} " , e.Message);            }             catch  (Exception e)            {                Console.WriteLine( " Exception Message: {0} " , e.Message);            }           }     }}

运行

使用下面的命令行和参数执行GetSnapshot 程序:

GetSnapshot.exe [workbook_path]  >  [snapshot_filename]

如:

C: \> GetSnapshot.exe http: // myServer02 / reports / reports / OriginalWorkbook.xlsx  >  SnapshotCopy.xlsx

上面的命令行会通过GetSnapshot工具在C:\目录下创建一个新文件。

注意:我们所用的工作薄必须放在受信任的位置。

说明

确保添加了Excel Web服务的引用,并修改using GetSnapshot.ExcelWebService; 指向到我们引用的Web service站点。

结果会以一个完整的工作簿的形式展现了Excel Services 会话中当前工作簿的状态。Excel Calculation Services会在现有会话打开的工作簿基础上产生成一个工作簿。该工作簿会反映出所有在原先工作簿上此次会话中已发生的变更:输入的参数值,刷新后的外部数据连接,基于参数和外部数据计算出的公式等。这与用户在Excel Web Access中选择在Excel中打开后所得到的结果完全相同。

一个快照是一个由Excel Calculation Services生成的工作薄。它用于展现当前状态的一个“报告”或一个“结果”型的东西。它包含了所有我们可以通过浏览器访问Excel Web Access看到的内容,不过它是以工作薄文件的格式提供的。

一些快照(比如之前提到的“published item snapshots”)仅仅包含Excel文件的一部分(作者在保存文件到服务器时选择的可以查看的部分)。这类快照包含了原来文件的布局和格式,最新的Excel Calculation Services计算出的值,但是并不包含Excel公式和外部数据连接。

您可以获得一个您之前保存在服务器上的工作薄的快照,即使您没有访问服务器上相应文件的权限。

在一些情况下,我们会需要将GetWorkbook调用的返回结果保存起来。Excel Web Services是Excel Services的一个前端界面。通常Excel Web Services不会创建,修改或保存文件。它只在会话开始时读取它们。因此,Excel Web Services并没有提供一个保存工作簿的方法。如果要保存一个工作薄,我们一般要使用其他目标文件存储的API。比如:

* 如果我们要将文件存到WSSv3的文档库中,需要使用Windows SharePoint Services 3.0的对象模型或Web服务。

* 如果我们要将Excel 文件存到一个流,一个本地文件,或一个文件共享,需要使用Microsoft .NET Framework 库。

* 如果我们要将Excel 文件存到一个HTTP 位置, 需要使用Web Distributed Authoring and Versioning (WebDAV).注:WebDAV也叫HTTP/DAV协议或DAV协议。

我们可以使用各种各样的Microsoft .NET Framework库来保存一个工作簿。这里是一个MSDN中的例子:How to: Save a Workbook

查看视频

转载于:https://www.cnblogs.com/Sunmoonfire/archive/2007/07/20/825269.html

相关资源:数据结构—成绩单生成器

最新回复(0)