Excel Services 已知问题和提示
上次修改时间: 2011年9月7日
适用范围: SharePoint Server 2010
本文内容
Excel Web Service
了解安全性
Visual Studio
Excel Services 用户定义函数
常规
下面是使用 Excel Services 的已知问题和提示。
Excel Web Service
查看 WSDL 位置
可以通过导航到服务器上的以下 URL 来查看 Excel Web Services Web Services 描述语言 (WSDL) 页:http://<server>/<customsite>/_vti_bin/excelservice.asmx?WSDL
如果没有自定义网站,则可以使用以下 URL 查看 WSDL:
http://<server>/_vti_bin/excelservice.asmx?WSDL
有关详细信息,请参阅访问 SOAP API。
了解 Excel Web Services 和命名空间
下面是 Excel Web Services 和命名空间:
包含所有 API 方法的单个 Web 服务对象:ExcelService
架构命名空间:https://schemas.microsoft.com/office/excel/server/webservices
Web 服务页面名称:ExcelService.asmx
本地链接或链接到 Web 服务
有些情况下,您应该直接链接到 Microsoft.Office.Excel.Server.WebServices.dll,并像访问任何本地程序集一样访问它,而不是通过 SOAP over HTTP 作为 Web 服务调用它。
有关何时使用直接链接的详细信息和指南,请参阅环回 SOAP 调用和直接链接。
了解无效字符
如果工作簿单元格包含在 XML 响应中无效的字符,对 GetCell 和 GetRange 方法的调用将会失败。
例如,如果单元格包含的字符的十六进制值为 0x1、0x2 ... 0x8,ASP.NET 分析器将会引发异常,指出写入 XML 响应的字符的值无效:
System.InvalidOperationException: 客户端发现响应内容类型为"text/html; charset=utf-8",但应为"text/xml"。请求失败,错误信息为: -- <html> <head> <title>""( 十六进制值 0x01)是无效的字符。</title>
此行为是预期行为。定义有效 XML 响应中允许哪些字符的 XML 规范中规定了十六进制值 0x1、0x2 ... 0x8 是无效 XML 字符:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
有关详细信息,请参阅 W3C 可扩展标记语言 (XML) 规范 (http://www.w3.org/TR/REC-xml\#NT-Char)。
保存工作簿
对工作簿进行更改(例如通过使用 Excel Web Services 设置某个范围的值)时,将只为该特定会话保留对工作簿的更改。这些更改不会保存或保留回原始工作簿。当前工作簿会话结束时(例如调用 CloseWorkbook 方法或会话超时的时候),所做的更改将丢失。
如果要保存对工作簿做出的更改,可以使用 GetWorkbook 方法,然后使用目标文件存储区的 API 保存工作簿。有关详细信息,请参阅如何:获取整个工作簿或快照和How to: Save a Workbook。
了解 Excel Web Services 代理类的 Url 属性
不要对要打开的工作簿的位置使用 Excel Web Services 代理的 Url 属性。Visual Studio 生成的 Web 服务代理类的 Url 属性会获取或设置客户端请求的 XML Web Services 的基 URL。对 Excel Web Services 而言,这通常是:
http://<server name>/_vti_bin/ExcelService.asmx
若要指定工作簿的位置,请使用 OpenWorkbook 方法而不是 Url 属性,如以下代码示例所示。
//Instantiate the web service and make a status array object.
ExcelService xlservice = new ExcelService();
string sheetName = "Sheet1";
//Set the path to the workbook to open.
//TODO: Change the path to the workbook
//to point to a workbook you have access to.
//The workbook must be in a trusted location.
string targetWorkbookPath =
"http://myserver02/example/Shared%20Documents/Book1.xlsx";
//Set credentials for requests.
xlservice.Credentials = System.Net.CredentialCache.DefaultCredentials;
//Call the open workbook, and point to the trusted
//location of the workbook to open.
string sessionId = xlservice.OpenWorkbook(targetWorkbookPath, "en-US",
"en-US", out outStatus);
有关详细信息,请参阅 WebClientProtocol.Url 属性(该链接可能指向英文页面) (https://msdn.microsoft.com/en-us/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebServicesProtocolsWebClientProtocolClassUrlTopic.asp)。
了解安全性
使用工作簿权限
了解有关工作簿权限的以下问题:
Excel Web Services 使用 Microsoft SharePoint Foundation 授权方案来验证调用方是否有权在 SharePoint Foundation 网站(即,Excel Web Services 所在的网站)上远程调用 API(即,进行 Web 服务调用)。如果调用方没有"使用远程 API"权限,Excel Web Services 将返回"HTTP 401 (未授权)"错误,并记录"API 授权失败"事件。Excel Web Services 只对以 SOAP 调用形式发出的调用执行这些授权检查。不将来自在本地链接到 Microsoft.Office.Excel.Server.WebServices.dll 的应用程序的调用视为远程调用。因此,不会对其进行授权检查。但是,如果在本地链接到 Microsoft.Office.Excel.Server.WebServices.dll 的应用程序本身是 SOAP 服务并处理该服务的 SOAP 调用,则对 Excel Web Services 的调用将视为 SOAP 调用(即使应用程序直接链接到 Microsoft.Office.Excel.Server.WebServices.dll 也是如此)。在此方案中,Excel Web Services 将执行授权检查。
若要获取整个工作簿(例如,通过使用 WorkbookType.FullWorkbook 参数调用 GetWorkbook 方法),调用方需要工作簿的"打开"权限或"读取"权限(对于文件共享)。
若要调用 GetApiVersion 方法,则无需任何权限。
对于其余 Excel Web Services 方法,除凭据外,调用方还需要工作簿的"查看"权限(对于 SharePoint Foundation)或"读取"权限(对于文件共享)。
受信任的位置
您希望在 Excel Services 中打开的工作簿必须位于受信任的位置。否则,用于打开工作簿的 Excel Web Services 调用将失败。
有关如何信任某个位置的信息,请参阅如何:信任一个位置和How to: Trust Workbook Locations Using Script。
Visual Studio
Microsoft Visual Studio 代理行为
当 Microsoft Visual Studio 为客户端项目创建调用 Excel Web Services 的代理类时,它具有以下行为:
如果某个方法没有任何返回值,并且具有一个或多个 out 参数,则第一个 out 参数将会移动以成为返回值。也就是说,代理类中的方法的方法签名中的 out 参数将会减少一个。但是签名将具有一个返回值,其类型和内容曾属于第一个 out 参数。
受影响的 Excel Web Services 方法有:
Calculate
CalculateA1
CalculateWorkbook
CancelRequest
CloseWorkbook
GetSessionInformation
Refresh
SetCell
SetCellA1
SetRange
SetRangeA1
Excel Services 用户定义函数
首先检查全局程序集缓存,然后检查本地文件夹
根据 Microsoft .NET Framework 中的设计,将会加载全局程序集缓存中的程序集,而不是本地文件夹中的同一程序集。公共语言运行时将首先在全局程序集缓存中查找程序集,然后在本地文件夹中搜索。
因此,如果某个程序集安装在全局程序集缓存中并位于 UDF 列表中但被禁用(或完全从 UDF 列表中删除),同时本地文件夹中安装有一个相同的程序集并且已启用,则仍将加载并使用全局程序集缓存中的程序集而不是本地文件夹中的同一程序集。
这不会影响程序集版本已经过修改(即程序集不再是同一个)的升级方案。
常规
不保持 Sharedstring.xml 中的字符串顺序
Excel Services 不保持工作簿共享字符串表(Microsoft Office Excel XML 格式文件的 Sharedstrings.xml 部分)中字符串的原始顺序。例如,执行以下步骤:
使用 Excel 打开某个文件。
以 .xlsx 文件格式保存该文件。
将该文件上载到位于受信任位置的文档库。
使用 Excel Web Access 在文档库中打开该文件。
单击"用 Excel 打开"。
以 .xlsx 文件格式保存该文件。
如果将在步骤 2 中创建的 Sharedstrings.xml 文件与步骤 6 中创建的文件进行比较,您会发现 Sharedstrings.xml 部件的顺序可能有所不同。
您编写的应用程序不应该假定共享字符串表中字符串的顺序是固定不变的。例如,不能将共享字符串表替换为已本地化的现有转换表。必须进行调整以符合共享字符串表中字符串的新排序方式。