**摘要:**了解 Microsoft SharePoint Server 2010 中提供的新客户端服务功能,包括 Word Automation Services 和 Excel Services。
上次修改时间:
2015年3月9日
适用范围:
Business Connectivity Services | Office 2007 | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio | Word Autmomation Services
Microsoft Office 2010 Server 应用程序概述
使用 Excel Services
**供稿人:**John Peltonen,
3Sharp
Microsoft Office 2010 Server 应用程序概述
使用 Excel Services
Excel Web Access Web 部件
不支持的客户端功能
Excel Web Services 中的新增功能
用户定义函数
ECMAScript(JScript、JavaScript)对象模型
REST API
下载用于 Microsoft SharePoint Server 2010 的 Excel Services 示例 (xlrestform.zip)(该链接可能指向英文页面)
Microsoft Office 2010 Server 应用程序概述
用户往往在 Microsoft SharePoint Server 环境中花费很长时间,而且都有正当的理由。由于此环境的功能不断扩展,现已包括丰富的社交网络功能、任务和日历管理、工作流和窗体(无代码和有代码两种)等功能,因此 SharePoint Server 2010 已不再只是数据存储库。当然,SharePoint Server 一直以来都是可用于存储和管理 Microsoft Office 客户端应用程序所生成的文档的卓越工具。SharePoint Server 2010 扩展了用户可在服务器中对这些文档执行的操作的领域。
Microsoft Word、Microsoft Excel、Microsoft OneNote、Microsoft Visio、Microsoft PowerPoint、Microsoft Access、Microsoft Project 当然还有 Microsoft InfoPath 在服务器上都具有扩展功能。Word、Excel、OneNote 和 PowerPoint 具有对应的 Web 应用程序,使用户无需客户端便可以直接在 SharePoint Server 中打开和编辑文档。而且,每个应用程序都支持多个用户同时编辑同一文档的多用户共同创作方案。
通过 Visio Services,用户可在浏览器内查看 SharePoint 2010 中包含的 Visio 图表。如果安装了 Microsoft Silverlight,用户还可获得平移、缩放和打开超链接的交互式点击体验。如果未安装 Silverlight,图表将以 PNG 格式呈现。而且,这些图表可由数据驱动,从而产生非常丰富的仪表板样式的显示。在 SharePoint 2010 中,可直接使用此功能对 Microsoft SharePoint Designer 工作流状态进行可视报告。
Access 一直都是功能强大的桌面应用程序平台。在 2010 版本中,Access 还成为服务器端应用程序开发平台,因为用户现在可以将 Access 数据库作为 SharePoint 网站发布。数据、表单、图形、报告甚至简单的逻辑都可以发布到网站。然后,用户即可从 Access 客户端或浏览器访问这些相同的数据和功能。由于每个 MDB 文件都引用 SharePoint Server 中包含的数据和逻辑,因此可减少因桌面和电子邮件中的多种 MDB 格式版本所产生的困扰。此外,用户还可以直接通过 Access 客户端来管理已发布网站的外观和行为,而无需 IT 部门的参与。
本文不讨论上述功能,而是重点介绍 Excel Services 非常具体而且通常与编程相关的方面。在 SharePoint Server 2010 中,为 Excel Services 添加了极其强大的功能,其中包括两个新的编程模型:ECMAScript(JScript、JavaScript)对象模型和 Excel Services REST API。Word Automation Services 也是一种新增功能,通过它无需使用 Word 客户端应用程序便可在服务器上实现 Word 自动化。
有关使用 Word Automation Services 进行开发的信息,请参阅
使用 SharePoint 2010 Word Automation Services 进行开发
使用 Excel Services
从每个 Office 应用程序的角度来看,Excel Services 通过其服务方案提供了到目前为止最广泛、最多变的功能级别。在开发解决方案时,可从三种对象模型中进行选择(本文将分别对其进行阐述)。此外,还对 Excel Web Access Web 部件做了重大改进,从而使用户可与整个工作簿或命名对象进行更丰富的交互。最后,您还可以编写能够从位于服务器上的工作簿中调用的自定义服务器端用户定义函数。以下各节将分别阐述上述功能。
Excel Web Access Web 部件
Excel Web Access Web 部件首次出现于 Microsoft Office SharePoint Server 2007 中。其目标是高保真地呈现 Excel 工作表。该 Web 部件可以指向位于 SharePoint Server 内并通过 Excel Services 发布的工作表。为用户呈现的内容是工作表中已设定目标的固定内容。
SharePoint Server 2010 中的 Excel Services 对 SharePoint Server 2007 中提供的基本功能进行了扩展,以改善用户在与托管工作簿交互时的体验。首先,Excel Web Access Web 部件中支持更多基本级别的 Excel 客户端功能。现在,该 Web 部件支持滚动。在 SharePoint Server 2007 中,可以选择要在 Web 部件中显示的固定网格大小,但用户无法导航到其他区域。现在,如果您决定发布整个工作簿而不是某一命名对象,该工作簿将完全可供用户使用。用户可在工作表中滚动,甚至可以导航到其他工作表。
图 2 显示使用中的 Excel Web Access Web 部件示例。
图 2. Excel Web Access Web 部件示例
在图 2 中您可能已经注意到,该 Web 部件还支持图形。此外,用户还可以直接与工作表值交互,从而自动触发工作簿重新计算。例如,用户可以修改图 2 所示的每月项目表中的值,以查看这些值对图表的影响(通常位于右侧屏幕之外)。由于该 Web 部件不再需要通过页面刷新来重新计算工作簿,因此可以明显改进性能。与在 SharePoint Server 2007 中一样,Excel Web Access Web 部件提供工作表的只读版本,只随用户会话一起存储更改。
不支持的客户端功能
在 SharePoint Server 2007 中,如果 Excel Web Access Web 部件遇到任何不支持的功能,它将不加载工作簿。这会导致某些令人沮丧的情况,例如,Sheet3 中的单元格批注会导致某些人无法通过 Excel Web Access 在 Sheet1 中发布数据透视表。Excel Services 小组通过对不支持功能的类型进行分类,已在此领域取得了重大进展。现在,打开工作簿时,将忽略单元格批注、Microsoft Visual Basic for Applications (VBA) 代码和 Microsoft Office 艺术作品(包括 SmartArt)。此外,还将忽略 QueryTable 对象和外部工作簿引用,但会显示客户端应用程序最后呈现的值。最后,仍有一组不受支持的客户端功能。
在 Excel 和 Excel Services 中使用工作簿的差别
中提供的 SharePoint Server 2007 列表描述了不支持的功能(前面提到的项除外)。
大部分新增的 Microsoft Excel 2010 功能在 Excel Web Access Web 部件中都在一定程度上受支持。来自 Excel Services 团队博客的这一列表包括许多新增的 Microsoft Excel 2010 客户端功能以及 Excel Web Access 对这些功能的支持级别:
Excel 中的迷你图(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel 2010 中的图标改进(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel 2010 中的数据条改进(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel 2010 中的函数改进(该链接可能指向英文页面)(该链接可能指向英文页面)
简单(甚至有趣)的数据浏览:Excel 2010 切片器简介(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel 2010 中的数据透视表命名集(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel 2010 中的一些数据透视表改进(该链接可能指向英文页面)(该链接可能指向英文页面)
PowerPivot 简介(该链接可能指向英文页面)(该链接可能指向英文页面)
Microsoft Excel 团队博客(该链接可能指向英文页面)(该链接可能指向英文页面)
中提供了原始列表。
有关 Excel Web Access 的详细信息,请参阅 Microsoft Excel 团队博客中的以下文章:
Excel Services 2010 概述(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 2010 中的 Excel Services 仪表板改进(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 2010 中的 Excel Services 管理改进(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 2010 中的 Excel Services 功能支持(该链接可能指向英文页面)(该链接可能指向英文页面)
探索 Excel 2010 中的"发布到 Excel Services"功能(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel Web Services 中的新增功能
Excel Services 的许多编程功能(如 REST API 和 ECMAScript(JavaScript、JScript) 对象模型)都是此 Microsoft SharePoint Server 版本中新增的。不过,Excel Services Web 服务最初出现在 Microsoft Office SharePoint Server 2007 中。在 SharePoint Server 2007 中,您可以打开工作表,然后在工作表中进行更改、执行计算和读取特定值,但无法保存更改(所有更改都是随会话一起暂时存在)。也不能加载图表。这两项是 Excel Services Web 服务中请求次数最多的两项功能。现在,SharePoint Server 2010 中提供了这些功能和其他功能。
表 1 包含此发行版中添加的新方法,该表几乎是直接从资深 Excel Services 开发人员 Shahar Prish 的博客复制而来。
表 1. 新方法的列表
图 3 中显示的示例使用了 GetChartImageURL 方法和 OpenWorkbookForEditing 方法。在任何时候,示例应用程序都不会启动显式 Save 命令 (SaveWorkbook)。当打开工作簿进行编辑时,会直接将更改写入工作表,因此无需保存更改。当打开工作簿进行编辑时,应用程序的凭据会在 Excel 中显示为合著者。这意味着,如果其他人也在编辑该文档,他们会看到此应用程序正在编辑文档,并且还会看到实时保存的应用程序更改。
该应用程序需要一个特定的工作簿,以便根据生产线速度的修改来估计工厂生产线的产出。该应用程序是一个简单的 Windows 窗体应用程序,可在只读模式或读/写模式下加载工作表,允许您调整修饰符,然后显示生成的估计产出图表。
图 3. Excel Web Services 应用程序示例
首先,必须创建对 Excel Services Web 服务的 Web 引用。若要添加引用,请在 Microsoft Visual Studio 的"解决方案资源管理器"中,右键单击"服务引用",然后选择"添加服务引用"。
此时将打开"服务引用"窗口。由于 Excel Services 服务不基于 Windows Communication Foundation (WCF),因此您不能使用此窗口,而是应单击"高级"以打开"服务引用设置"窗口,然后单击"添加 Web 引用"以加载"添加 Web 引用"窗口(请参阅图 4)。
此时,您可以输入 Excel Services URL:
https://server name/_vti_bin/ExcelService.asmx?wsdl
您可能还要为引用指定一个好记的名称。我选择了 XLSvc,如图 4 所示。
图 4. 创建 XLSvc Web 引用
下面是要添加的 using 语句。这两个语句都用于从 GetChartImageURL 所提供的 URL 中检索图像时的记帐工作。我首先尝试直接在 PictureBox 控件 (PictureBox.Load(url)) 中加载它,但通过该控件的内部 URL 请求无法传递凭据。因此,我不得不尝试其他方法,在以下示例的 GetImageFromURL 帮助程序函数中可以看出这一点。
// For WebRequest to retrieve the Chart URL.
using System.Net;
// For streams (when converting the image on the end of the URL to an "Image").
using System.IO;
使用以下全局变量跟踪 Excel Services 会话,很显然,这就是 Web 服务本身。
// Track the current session.
string sessionId = string.Empty;
// Excel Services reference.
XLSvc.ExcelService cli;
以只读方式打开工作簿。
private void OpenWrite_Click(object sender, EventArgs e)
XLSvc.Status[] status;
// Close the open workbook.
if (sessionId != string.Empty)
cli.CloseWorkbook(sessionId);
// Clear out the session ID.
sessionId = string.Empty;
// Open the workbook.
sessionId = cli.OpenWorkbookForEditing(txtURL.Text, "", "", out status);
// Initialize the form's fields.
initFields();
初始化窗体字段。
private void initFields()
XLSvc.Status[] status;
// Exit function if no workbook is open.
if (sessionId == string.Empty) return;
// Just like in the 2007 release, retrieve the range as an array of arrays.
object[] rows = cli.GetRangeA1(sessionId, "", "Modifier", true, out status);
foreach (var o in rows)
// This is a single cell, so we break after the first row.
object[] row = (object[])o;
txtModifierValue.Text = row[0].ToString();
break;
// Refactored this out because it is also used by "refresh".
LoadChart("Chart 2");
最后,加载图表。
private void LoadChart(string chartName)
XLSvc.Status[] status;
if (sessionId == string.Empty) return;
// This call will return a URL. At the other end of the URL is our image.
string url = cli.GetChartImageUrl(sessionId, null, chartName, out status);
// Unfortunately, we cannot just call picturebox.Load because credentials will not be passed.
pictChart.Image = GetImageFromURL(url);
private Image GetImageFromURL(string url)
WebRequest r = WebRequest.Create(url);
r.Credentials = System.Net.CredentialCache.DefaultCredentials;
WebResponse response = r.GetResponse();
Stream s = response.GetResponseStream();
Image img = Image.FromStream(s);
return img;
如果下载代码示例(用于 SharePoint Server 2010 的 Excel Services 示例(该链接可能指向英文页面)),您会发现以只读方式打开文件与以读/写方式打开文件所用的函数几乎相同。唯一的差别是前者调用 OpenWorkbook 而不是 OpenWorkbookForEditing。
下载其余的代码和工作表以尝试此功能(请参阅用于 SharePoint Server 2010 的 Excel Services 示例(该链接可能指向英文页面))。剩下的唯一一项功能是设置 Modifier 命名区域的值和重新加载图表。
cli.SetCellA1(sessionId, "", "Modifier", (object)txtModifierValue.Text);
LoadChart("Chart 2");
无论是否已打开工作簿进行编辑,此代码都完全相同。唯一的差别是,在默认的只读模式中,只对基于临时会话的工作簿副本进行修改,而在编辑模式下,会将更改写入 SharePoint Server 中的主要副本。
显而易见,Web 服务功能进行了很多扩展,从而实现更强大的方案。有关此功能的详细信息,请阅读 Shahar Prish 最新的三篇博客文章:
SharePoint 2010 中的 Excel Web Services 的新增功能(该链接可能指向英文页面)(该链接可能指向英文页面)
使用 Web Services API 打开工作簿进行编辑和设置计算选项(该链接可能指向英文页面)(该链接可能指向英文页面)
将 SetParameters 用于 Excel Web Services API(该链接可能指向英文页面)(该链接可能指向英文页面)
此外,还请阅读 SharePoint 2010 SDK 中的 Excel Web Services。
用户定义函数
有时,Excel 用户可能不得不使用非 Excel 自带的函数。在许多版本中,Excel 客户端应用程序都可以通过此方法进行扩展,使得开发人员可以创建 XLL 加载项,以在 Excel 客户端中展现自定义函数。在 SharePoint Server 2007 中,Excel Services 还支持服务器端用户定义函数,SharePoint Server 2010 继续提供此支持。使用托管代码,您可以生成服务器端用户定义函数,以公开使用方式与内置函数(如 =SUM() 或 RAND())相同的自定义函数。
这些函数只在服务器中可用,因此在客户端中编辑的工作簿无法访问这些函数。可通过 SharePoint 解决方案部署这些函数,由于这些函数可以访问第三方数据源和 Web 服务,因此功能可能非常强大。
有关创建和部署用户定义函数的详细演练,请参阅 SharePoint 2010 SDK 中的 Excel Services 用户定义函数。
ECMAScript(JScript、JavaScript)对象模型
JavaScript 对象模型是用于 SharePoint Server 2010 的 Excel Web Services 的另一项新增功能。该功能旨在使开发人员可通过编程方式与位于给定 SharePoint 网页中的 Excel Web Services Web 部件交互。通过编写在 SharePoint 网页中承载的 JavaScript(直接承载或通过内容编辑器 Web 部件承载),开发人员可与 Excel Web Access Web 部件交互并监视用户与这些部件的交互。
使用 JavaScript 对象模型,您可以通过地址区域或命名区域设置和检索单元格的值,并将用户导航到托管工作簿内的不同位置。还可以监视在用户添加内容或编辑单元格时发生的事件。
以下示例将指导您创建一个 JavaScript 文件,该文件使用用户选择的单元格的值来设置单元格 (Sheet1!B3) 的值。
首先,必须进行一些常规的 Excel Web Access 维护。特别需要指出的是,必须在页面上检索对 Excel Web Access Web 部件的引用。当然,首先必须允许页面加载并允许 Web 部件初始化。因此,您需要捕获 OnLoad 事件,对其进行初始化,并监视 Excel Web AccessapplicationReady 事件。在了解到 Excel Web Access 已就绪时,枚举所有控件实例的控件集合。在此示例中,只能找到第一个实例。
<script>
var ewa = null;
// Set page event handlers for onload and unload.
if (window.attachEvent) {
window.attachEvent("onload", ewaOmPageLoad);
else {
window.addEventListener("DOMContentLoaded", Page_Load, false);
// Load map.
function ewaOmPageLoad() {
if (typeof (Ewa) != "undefined") {
Ewa.EwaControl.add_applicationReady(ewaApplicationReady);
else {
// Error - the Excel Services Web Access ECMAScript is not loaded.
现在,您可以捕获页面中的各个 Excel Web Access Web 部件。您还可以为要开始在该特定控件中监视的所有事件设置事件处理程序。在此示例中,您要监视 activeCellChanged 事件。
function ewaApplicationReady() {
// Find the first Excel Web Access control on the page.
ewa = Ewa.EwaControl.getInstances().getItem(0);
// Add a cell changed event handler to the script.
ewa.add_activeCellChanged(cellChanged);
当单元格发生更改时,必须先确定其坐标位置(工作表、行和单元格)。在尝试确定用户是否选择了您必须响应的重要数据或不重要的随机单元格时,这样做很方便。在此情况下,您可以提取用户选择的任何单元格中的值并将其插入 Sheet1!A3。此代码并不假设用户只选择了单个值。当然,用户也可以选择一个区域。
在获得详细信息(坐标和区域)后,可以调用工作簿以异步设置目标区域的值。getRangeA1Async 事件需要目标区域、回调函数以及要放入区域中的值。执行回调时,会为其传递一个包含目标区域和值的 asyncResult 变量。这意味着,您可以多次调用此函数,而无需跟踪向变量中传递的内容。
function cellChanged(rangeArgs) {
// Find the sheet, column, and row the range starts in.
var sheetName = rangeArgs.getRange().getSheet().getName();
var col = rangeArgs.getRange().getColumn();
var row = rangeArgs.getRange().getRow();
// Making the assumption that this is a single cell, but it does not have to be.
var value = rangeArgs.getFormattedValues();
// Async call to set ranges. We pass the range, the call-back function, and the value we want to set.
ewa.getActiveWorkbook().getRangeA1Async("Sheet1!B3", getRangeComplete, value);
下面是异步回调。只需从 asyncResult 中提取区域和值并将该值转换为数组即可(请记住,这里假设用户只选择一个单元格而不是单元格区域)。
function getRangeComplete(asyncResult) {
// Find the range we are going to set.
var range = asyncResult.getReturnValue();
// Find the value we will put in the range.
var value = asyncResult.getUserContext();
// Assuming it is a single item (convert to a double array).
var values = [[value]];
// Set the value (again, asynchronously).
range.setValuesAsync(values, setValuesCallBack, null);
最后,从设置值调用中捕获回调。没有太多有趣的事要做,但如果您要执行一连串的操作,此步骤会很方便。
function setValuesCallBack(returnValues) {
// Nothing really interesting here. Just notifying the user that something happened.
window.status = 'Values Set';
</script>
这可能是一个很好的演练,但仍不足以让您开始工作。首先,您需要确定如何将脚本放置到 SharePoint 网页中。下面是一种操作方法:将脚本保存为 HTML 文件(在 Microsoft Visual Studio 中进行编辑后),将其上载到文档库(我极具创意地选择"共享文档"应该不会让您惊讶吧),然后向该页面中添加一个内容编辑器 Web 部件并使其指向"共享文档"中的 HTML 文件,如图 5 所示。也可以直接将脚本放入内容编辑器 Web 部件中。
图 5. 内容编辑器 Web 部件属性
此外,还要记住,Windows Internet Explorer 中现在提供了一款非常棒的开发人员工具,可用于在页面中调试 JavaScript,包括添加监视和放置断点(请参阅图 6)。若要加载该工具,请在 Internet Explorer 中按 F12 或在"工具"菜单上选择"开发人员工具"。
图 6. 开发人员工具脚本调试程序
尽管此代码是通过使用内容编辑器 Web 部件添加的,但它将作为页面的一部分运行。在这里可以看到,用户在 Sheet1 中选择了位于第 8 行、第 3 列的单元格。
REST API
基于 Excel SOAP 的 Web 服务是以编程方式与 Excel 工作簿交互的一种功能非常强大的方法。但是,这些服务绝不允许高级用户 (Power Users) 使用 Excel 对象。例如,如果用户能够在内部博客文章或 wiki 中嵌入图表并在加载或刷新该图表时自动更新该网页,那将非常理想。与之类似,如果高级用户能够在引用该图表时更新工作表参数,以便生成模拟方案并直接在 Word 文档中承载该方案,这样只要打开或保存文档便可刷新图表,那么情况就更为理想了。
从开发人员的角度来看,有人可能会认为 Excel Services REST API 不是真正的 REST 实现。但是,无论是否真正符合协议,它都是 API 的强大实现,允许开发人员和高级用户只通过 URL 即可访问工作簿中的对象。
例如,以下 URL 将返回位于 http://intranet.contoso.com 的首要网站的"共享文档"库中存储的 Book1.xlsx 工作簿的所有可检测到的组件。
http://intranet.contoso.com/\_vti\_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model $format=atom
此 URL 看起来很复杂,但在将其分为多个组成部分后,它就变得非常简单。
表 2. URL 组成部分
除了只列出工作簿中的项之外,还可以使用 REST 服务检索表和图表的原始数据或图像。您还可以与工作簿中的数据交互,为会对您检索的表和图表产生影响的特定区域设置值。表 3 列出了可发送到 REST 服务的所有命令以及每个命令的格式。
表 3. 命令列表
由于冒号(":")字符在 URL 中是一个特殊字符,因此 Sheet2!A1:B3 之类的正常区域声明无效。Excel REST API 需要一个管道符号("|")而不是冒号,如 "Sheet2!A1|B3"
虽然 REST API 不允许修改服务器中已保存的工作表实例,但您可以在查询所使用的内存中的实例中修改区域。例如,您可以设置专门修改所查询图表的区域的值。以下 URL 设置区域的值并请求图表的图像。
http://intranet.contoso.com/\_vti\_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Charts('sales')?Ranges('SalesYear')=2009?$format=image
用户可以在能够显示来自 Web 的文本或图像的任何环境中承载此内容。除了明显的博客和 wiki 外,与本文内容极为相关的一个来源是 Microsoft Word。
虽然您可能不知道什么是 Microsoft Word 域代码,但如果您曾经向文档中插入过目录或超链接,那么事实上您已经使用过域代码了。域代码是一种表示文档正文中的任意数量的动态类型内容的方法。若要查看整个域代码列表,请在功能区的"插入"选项卡上选择"文档部件",然后选择"域",如图 7 所示。
图 7. 访问整个域代码列表
有两种特殊的域代码 IncludePicture 和 IncludeText,它们用于嵌入文件或 URL 中的文本或图像。Word 通过定期刷新域代码(在执行"打开"、"保存"等操作时)使内容保持最新。
在工作簿中包括图表的最新图像
创建 REST URL,例如:
http://intranet.contoso.com/\_vti\_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Charts('Chart%205')?$format=image
在"插入"菜单上,选择"文档部件",然后选择"域"。
选择"IncludePicture"域,在"文件名"或"URL"字段中粘贴您的 URL,然后单击"确定"(请参阅图 8)。
图 8. 添加 IncludePicture 域
插入文本与之类似,但由于数据不是您正在查找的原始数据,因此情况会略为复杂。文本位于 ATOM 源中,或格式化为 HTML 形式。这些选项都不适用于 Word 文档。幸运的是,此域代码允许您在域代码中包含 XSL 转换或 XPath 查询。通过编写 XSLT 转换或 XPath 查询来查询提供的 ATOM 源,您可以选择相关数据并将其包含在文档中。
此示例 ATOM 源表示以下查询的结果。
http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Ranges('Sheet1!F1')?$format=atom
<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="http://excel.live.com/REST" xmlns:x="https://schemas.microsoft.com/office/2008/07/excelservices/rest" xmlns:d="https://schemas.microsoft.com/ado/2007/08/dataservice" xmlns:m="https://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">Sheet1!F1</title>
<id>http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Ranges('Sheet1!F1')</id>
<updated>2009-12-12T22:23:39Z</updated>
<author>
<name />
</author>
<link rel="self" href="http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/book1.xlsx/model/Ranges('Sheet1!F1')?$format=atom" title="Sheet1!F1" />
<category term="ExcelServices.Range" scheme="https://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<x:range name="Sheet1!F1">
<x:row>
<x:v>0.05</x:v>
<x:fv>5%</x:fv>
</x:row>
</x:range>
</content>
</entry>
除了 InsertText 字段的 Filename 或 URL 字段属性外,还必须更新以下两个字段选项:
命名空间映射
在您将查询的 XML 中会使用两个命名空间:ATOM 源命名空间和 Excel Services REST 命名空间。以下字符串将定义这些命名空间并创建 XPath 查询将引用的命名空间映射。
xmlns:a="http://www.w3.org/2005/Atom"
xmlns:x="https://schemas.microsoft.com/office/2008/07/excelservices/rest"
XPath
幸运的是,XPath 相对简单。<fv> 元素包含已设置格式的单元格值。以下 XPath 会检索该值。
/a:entry/a:content/x:range/x:row/x:c/x:fv
图 9. 添加 InsertText 字段
很显然,这并不是只有经验最丰富的用户才能执行的操作。但是,当您考虑 Office Open XML 格式的服务器端文档生成方案(以编程方式操作这些字段代码)或 Microsoft Visual Studio 加载项中的客户端 Microsoft Office 开发工具(可在应用程序运行时以编程方式添加字段代码)时,会发现这些工具的功能非常强大。
当然,您也可用编程方式访问和操作 ATOM 源。以下代码示例是可供下载的示例应用程序(用于 SharePoint Server 2010 的 Excel Services 示例(该链接可能指向英文页面))的一部分。该示例应用程序会查询位于首要网站上的工作表,枚举其命名区域,然后显示选定区域的值。
图 10. 列出工作表中的命名区域的示例应用程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// Need this to process the ATOM Feed.
using System.Xml.Linq;
// Specifically for the XMLUrlResolver to pass credentials to the Web service.
using System.Xml;
// There are streams ahead.
using System.IO;
namespace WindowsFormsApplication1
public partial class Form1 : Form
// Declare all my namespaces up top so that I can just reference a short variable name down below :)
const string atomNameSpace = "http://www.w3.org/2005/Atom";
const string xlsvcNameSpace = "https://schemas.microsoft.com/office/2008/07/excelservices/rest";
private void button1_Click(object sender, EventArgs e)
// As long as we have a server name and relative path to the worksheet, call the Web service.
if(txtSite.Text != string.Empty & txtSpreadsheet.Text != string.Empty)
LoadRanges();
private void LoadRanges()
string relativeUri;
XNamespace a = atomNameSpace;
Stream s;
// Build the relative URL for the Excel REST Web service.
relativeUri = "/_vti_bin/ExcelRest.aspx/" + txtSpreadsheet.Text + "/model/Ranges?$format=atom";
// Pass the server portion of the URL and the relative URL down
// and receive a stream with the ATOM feed results.
s = GetAtomResultsStream(txtSite.Text, relativeUri);
// Load the stream into an XDocument.
XDocument atomResults = XDocument.Load(s);
// Query the XDocument for all title elements that are child elements of an entry element.
IEnumerable<XElement> ranges =//= atomResults.Root.Descendants(a + "title")
from t in atomResults.Descendants(a + "title")
where t.Parent.Name == a+"entry"
select t;
// Add all the elements that we found to the listbox.
foreach (XElement r in ranges)
listBox1.Items.Add((string)r);
private Stream GetAtomResultsStream(string serverName, string relativeUri)
XNamespace a = atomNameSpace;
// I use the XMLUrlResolver to pass credentials to the Web service.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Build the URI to pass the resolver.
Uri baseUri = new Uri("http://" + serverName);
Uri fullUri = resolver.ResolveUri(baseUri, relativeUri);
// Mostly for debugging, display where we are going.
lblUrl.Text = fullUri.ToString();
// Call the resolver and receive the ATOM feed as a result.
Stream s = (Stream)resolver.GetEntity(fullUri,null,typeof(Stream));
return s;
Excel REST Web 服务具有超乎寻常的强大功能。它可以涉及大量用户需求和解决方案情况,无论是在显示最新可用数据的网页中嵌入 URL 之类非常基本的任务,还是自定义 Microsoft .NET Framework 解决方案。
有关 Excel REST API 的详细信息,请参阅以下资源:
Shahar Prish 的博客 Cum Grano Salis
欢迎使用新的 Excel Services!(该链接可能指向英文页面)(该链接可能指向英文页面)(由多个部分构成的介绍 REST 的系列第一部分)
对 Excel Services Windows 7 小工具进行编码 – 第 1 部分 - 设置(该链接可能指向英文页面)(该链接可能指向英文页面)由七个部分构成的系列第一部分,该系列介绍如何对使用 Excel Services 数据的桌面小工具进行编码)
Microsoft Excel 团队博客
使用 Excel Services 2010 REST API 对电子表格数据进行简单访问(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 2010 中的 Excel Services 的 REST API 语法(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 2010 中的 Excel Services REST API 示例(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 2010 SDK 中的 Excel Services REST API
本文详细介绍了 Microsoft SharePoint Server 2010 中提供的客户端服务的一些非常强大的新功能。在考虑下一个应用程序的体系结构时,您有许多选项可以选择:在没有 Word 客户端的情况下以编程方式呈现、打印和转换 Word 文档的功能;在网页或文档中轻松嵌入实时 Excel 图表的功能;以及以编程方式处理 Excel 工作簿的多种方式。如果一切顺利,您可以尝试这些功能,并且这些功能的选择将会更加容易。
当然,不要认为某一功能必须独立于其他功能或其他客户端和服务器端功能来使用。没什么能阻止您创建文档生成解决方案,以便通过编程方式从 ATOM 源中插入实时 Excel 图表、使用 Word Automation Services 呈现文档,然后将文档转换为 PDF。实际上,这听起来太让人振奋了。现在,我已经想好下一个项目的目标了。
有关详细信息,请参阅以下资源:
Excel Services 示例(该链接可能指向英文页面)
Word Automation Services
使用 SharePoint 2010 Word Automation Services 进行开发
Word 团队博客:Word Automation Services 简介(该链接可能指向英文页面)(该链接可能指向英文页面)
Excel 团队博客:Excel Services 2010 概述(该链接可能指向英文页面)(该链接可能指向英文页面)
Shahar Prish 的博客:SharePoint 2010 中的 Excel Web Services 的新增功能(该链接可能指向英文页面)(该链接可能指向英文页面)
SharePoint 开发中心
欢迎使用 Microsoft SharePoint 2010 SDK
Office 开发中心