如果我们要把创作完工作簿文件副本存放在某处,然后发送给某人,那么最好的方式就是使用Excel Web Services。通过Excel Web Services我们可以得到一个工作簿或一个快照。当用户或应用程序请求一个快照时,Excel Services会在服务器端打开Excel文件,刷新数据源,并计算所有Excel公式,最后生成并通过Web服务API发送回一个快照。
下面的例子展示了如何在Excel Web Services中获取:整个工作簿,一个整个文件的快照,或一个文件内某个工作表或对象的可视范围的快照。
在Excel Web Services中用GetWorkbook方法得到整个工作簿或某个类型的快照。
获取快照
下面的代码会返回整个Excek工作簿的一个快照。其中使用WorkbookType.FullSnapshot枚举作为GetWorkbook方法的第二个参数。
out status);
获取可视项的一个快照
如果要获取当保存工作薄到服务器上时Excel工作簿作者所选取的可视区域的一个快照,可以使用WorkbookType.PublishedItemsSnapshot枚举值。如下:
out status);
获取整个工作簿
如果要获取整个工作簿在当前会话状态(session state)下的快照,可以使用WorkbookType.FullWorkbook枚举值。
out status);
WorkbookType.FullWorkbook和 WorkbookType.FullSnapshot选项只有在当前用户具有文件的打开权限是才有效。如果用户是只读权限,调用就会失败。
完整的代码
下面的命令行程序接受一个命令行参数,即服务器上工作簿的路径。程序会调用Web服务打开该工作簿并获取一个快照,然后将其write到标准输出上。这样我们将其重定向到一个新的快照文件。
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工具在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