Eric's Blog

有需求才有进步

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  原文: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.FullWorkbookWorkbookType.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

查看视频

posted on 2008-03-12 15:39  Eric.Chai  阅读(326)  评论(0编辑  收藏  举报