Excel Services 的已知问题和提示

以下列出了在使用 Excel Services 时的已知问题和提示。

Excel Web Services

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

服务和命名空间

  • 包含所有 API 方法的单个 Web 服务对象:ExcelService

  • 架构命名空间:https://schemas.microsoft.com/office/excel/server/webservices

  • Web 服务页名称:ExcelService.asmx

本地链接或 Web 服务

在某些情况下,应该直接链接到 Microsoft.Office.Excel.Server.WebServices.dll 并访问它(就像对待任何本地程序集一样),而不是通过 HTTP 上的 SOAP 将它作为 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 保存该工作簿。有关详细信息,请参阅如何:获取整个工作簿或快照如何:保存工作簿

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/zh-cn/library/system.web.services.protocols.webclientprotocol.url.aspx,)。

安全性

工作簿权限

  • Excel Web Services 使用 Windows SharePoint Services 3.0 授权方案来验证调用方有权远程在 Windows SharePoint Services 3.0 网站(即 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 方法,除了需要凭据外,调用方还需要工作簿的“查看”权限(在 Windows SharePoint Services 3.0 中)或“读取”权限(在文件共享中)。

受信任位置

要在 Excel Services 中打开的工作簿必须放在一个受信任位置。否则,为打开工作簿而进行的 Excel Web Services 调用将失败。

备注

有关如何信任位置的信息,请参阅如何:信任一个位置如何:使用脚本信任工作簿位置

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 用户定义函数 (UDF)

先检查全局程序集缓存,然后检查本地文件夹

Microsoft .NET Framework 中特意设计为加载全局程序集缓存中的程序集,而不是加载本地文件夹中的同一程序集。公共语言运行库将首先在全局程序集缓存中查找程序集,然后才在本地文件夹中搜索该程序集。

因此,如果某程序集安装在全局程序集缓存中,并位于 UDF 列表中但被禁用(或从 UDF 列表中完全删除),而且在本地文件夹中安装并启用了同一程序集,则仍将加载和使用全局程序集缓存中的程序集,而不是本地文件夹中的同一程序集。

这不会影响已修改了程序集版本(意味着程序集不再相同)的升级方案。

常规

Sharedstring.xml 中字符串的顺序未保持不变

Excel Services 不保持工作簿共享字符串表(Microsoft Office Excel XML 格式文件中的 sharedstrings.xml 部分)中的字符串原始顺序。例如,执行以下步骤:

  1. 在 Microsoft Office Excel 2007 中打开一个文件。

  2. 以 .xlsx 文件格式保存该文件。

  3. 将该文件上载到是受信任位置的文档库。

  4. 通过使用 Excel Web Access 打开文档库中的该文件。

  5. 单击“在 Excel 中打开”。

  6. 以 .xlsx 文件格式保存该文件。

如果将在步骤 2 中创建的 sharedstrings.xml 文件与在步骤 6 中创建的该文件进行比较,您会发现 sharedstrings.xml 部分的顺序可能不同。

不应该编写认为共享字符串表中的字符串顺序固定不变的应用程序。例如,不能用现有的已本地化的转换表来替换共享字符串表。必须调整为共享字符串表中的新的字符串顺序。

See Also

任务

如何:信任一个位置

如何:使用脚本信任工作簿位置

概念

Excel Services 最佳做法

Excel Services 警报

Excel Services 体系结构

Excel Services 中不支持的功能

访问 SOAP API

Excel Services 博客