下面是用于处理 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
- 架构命名空间:
http://schemas.microsoft.com/office/excel/server/webservices - Web 服务页面名称: ExcelService.asmx
在本地链接或链接到 Web 服务
在某些方案中,您应该直接链接到 Microsoft.Office.Excel.Server.WebServices.dll 并像访问任何本地程序集一样对其进行访问,而非通过 SOAP over HTTP 调用 Web 服务。
有关何时使用直接链接的详细信息和指南,请参阅 Loop-Back SOAP 调用和直接链接。
了解无效字符
如果工作簿单元格包含在 XML 响应中无效的字符,调用 GetCell 和 GetRange 方法将失败。
例如,如果单元格包含具有 16 进制值 0x1、0x2 ... 0x8 的字符,ASP.NET 解析器将抛出异常,指示写入到 XML 响应的字符的值无效:
System.InvalidOperationException:客户端找到响应内容类型“text/html; charset=utf-8”,但预期值为“text/xml”。 请求失败并显示错误消息:-- <html><head><title>'',十六进制值0x01,是无效字符。
此行为在意料之中。 定义哪些字符在有效 XML 响应中被允许的 XML 规范指定 16 进制值 0x1、0x2 ... 0x8 为无效的 XML 字符:
har ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] / 任何 Unicode 字符,不包括代理块、FFFE 和 FFFF。 /
有关详细信息,请参阅 W3C 可扩展标记语言 (XML) 规范。
保存工作簿
更改工作簿时(例如,使用 Excel Web Services 将值设置为区域),只会对特定会话保留对工作簿所做的更改。 更改不会保存到原始工作簿中。 当前工作簿会话结束时(例如,当您调用 CloseWorkbook 方法时,或当会话超时时),您所做的更改将丢失。
如果您想将更改保存到工作簿,可以使用 GetWorkbook 方法,然后使用目标文件存储的 API 保存工作簿。 有关详细信息,请参阅 如何:获取整个工作簿或快照和 如何:保存工作簿。
了解 Excel Web Services 代理类的URL 属性
请勿对您想要打开的工作簿的位置使用 Excel Web Services 代理的 Url 属性。 由 Visual Studio 生成的 Web 服务代理类的 Url 属性可获取或设置客户端请求的 XML Web 服务的基 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 属性。
了解安全性
使用工作簿权限
请注意下列有关工作簿权限的问题:
- Excel Web Services 使用 Microsoft SharePoint Foundation 授权方案来验证调用方是否有权调用 api (即在 SharePoint Foundation 网站上) Web 服务调用, (即 Excel Web Services 所在的网站远程) 。 如果调用方没有“使用远程 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 调用,则即使应用程序直接链接到 Microsoft.Office.Excel.Server.WebServices.dll) ,对 Excel Web Services 的调用看起来就像是 SOAP 调用 (。 在此方案中,Excel Web Services 将执行授权检查。
- 要获取整个工作簿(例如,通过调用使用
WorkbookType.FullWorkbook属性的 GetWorkbook 方法),调用者需要具备工作簿的"打开"权限或文件共享的"读取"权限。 - 调用 GetApiVersion 方法无需权限。
- 对于除凭据以外的其余 Excel Web Services 方法,调用者需要具备工作簿的"查看"权限(在 SharePoint Foundation 中)或"读取"权限(在文件共享中)。
受信任位置
您想在 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 用户定义函数
首先检查全局程序集缓存,然后检查本地文件夹
根据 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 部分的顺序可能不同。
编写应用程序时不应假定共享字符串表中的字符串顺序是固定的。 例如,您不能将共享字符串表替换为现有的本地化翻译表。 您必须调整为共享字符串表中字符串的新顺序。