简介:Microsoft InfoPath 2007中文版产品数据手册,面向企业信息化人员、IT管理员及Office高级用户,系统介绍电子表单解决方案在信息收集、流程自动化与跨平台部署中的实际价值。文档涵盖通过Outlook邮件表单、浏览器及移动设备完成填写的应用场景,同时说明无代码数据验证、屏幕提示、格式化条件等设计功能,并提档到与SharePoint Server 2007、Visual Studio 2005及XML标准的集成能力。资源包内含1个doc格式文档,大小849KB,便于离线查阅与分享;内容基于微软官方Datasheet翻译整理,可作为快速了解InfoPath 2007新特性与部署选项的参考手册。已有129人在CSDN学习该资料,适合需要选型评估或制作项目方案的读者直接下载使用。
1. 为什么 2025 年还要翻 InfoPath 2007 的技术资料
2025 年还在搜 “InfoPath 2007”,多半不是图新鲜,而是手里正好压着一个 .xsn 文件:OA 里跑了好多年的请假单、报销流程、供应商登记表,数据全灌进了 SharePoint 列表或 SQL Server,可一到换服务器、迁移权限、加审批节点的时候,没人说得清这张表单当年是怎么发布上去的。Datasheet 这类官方规格书讲的是“这产品能干什么”,可它不讲的坑——模板结构、发布权限、完全信任签名、托管代码调试——才是在生产环境里接手的人真正要面对的东西。这篇按一线运维和开发的实际顺序展开:先拆模板,再讲发布,然后给代码和排错方法,最后落到迁移判断。适合要接手旧表单、做技术评估,或者被要求“把这个表搬到新平台”的从业者。
2. InfoPath 2007 表单模板的内部结构与命令行发布
2.1 InfoPath 2007 设计器里的三个关联概念:视图、字段和数据连接
InfoPath 2007 设计器(InfoPath Designer)给人的错觉是“像 Word 一样画表单”,但不能这么理解。一个 .xsn 模板同时包含三层东西:视图决定用户看什么,字段定义数据形状,数据连接决定数据进出的通道。三者由 manifest.xsf 串起来。接手旧項目时,最先要在设计器里点开的是“工具 → 数据连接”和“工具 → 表单选项”,因为 Datasheet 里承诺的功能(多人填写、离线缓存、提交到多个目标)全是在这两个面板里做的配置,而不是代码。
一个经典误解是把视图切换当成页面跳转。InfoPath 2007 的视图切换只是同一份 XML 数据换一套 XSLT 展示,字段值不会因为切换视图而重新创建。所以排查“下一页按钮点了没反应”时,先看按钮的规则是“切换视图”还是“提交”,再看切换目标视图是否正确,不要去查代码——多半没有代码,规则在 XSF 的 action 里就已经定义好了。
字段维护上,2007 模板与后来版本最大的差异是字段绑定方式。早期模板大量使用“重复表”(Repeating Table),而且默认把标题行也算进数据节点,导致数据接收端多出一行看不见的元素。常见做法是:接 SharePoint 列表时,让表单的“提交数据”连接指向列表,字段映射时手动排除标题行节点。
2.2 解包 XSN:用 expand 命令查看 InfoPath 2007 模板的真实文件结构
不需要打开设计器也能看清一个 .xsn 里面是什么。.xsn 本质是一个 CAB(Cabinet)压缩包,Windows 自带的 expand 命令就能解开。
mkdir xsn_extract expand -F:* "ApprovalForm.xsn" "xsn_extract\"参数说明:-F:* 表示解出压缩包内所有文件;第二个参数是输出目录。解开后目录下通常会有 manifest.xsf、template.xml、view1.xsl、sample.xml,若表单启用了托管代码,还会看到 FormCode.cs 或 FormCode.vb(编译后会在二进制文件夹里)。这个手段在目标机器没有安装 InfoPath 时特别有用。
拿到文件后按这个顺序读:先看 manifest.xsf 的 xsf:formTemplate 节点,它声明了版本号、安全级别、发布目标 URL;然后看 xsf:dataObjects 里定义的 secondary data source(二次数据源),这里有对 SQL Server、Web 服务或 XML 文件的连接定义;最后才看 view1.xsl 的顶部 namespace 声明,确认视图绑定的命名空间是否有出入。注意,expand 只负责解包,改完任何文件后要重新打包成 CAB 并改扩展名为 .xsn 才能用。
| 解包后文件 | 作用 | 改动风险 |
|---|---|---|
| manifest.xsf | 模板配置:视图、安全级别、数据连接 | 高,结构错误会导致模板无法加载 |
| template.xml | 表单默认数据和初始字段 | 中,字段结构必须与 xsf 声明一致 |
| view1.xsl | 视图的展示逻辑 | 低到中,误改会改变布局或显示空白 |
| FormCode.cs | 托管代码入口 | 高,需重新编译签名 |
2.3 用 stsadm 命令批量发布 InfoPath 2007 表单模板
设计器里点“发布”会一步步要求填 SharePoint 站点地址、表单库类型、文件权限,在一次性交付十几个模板时很不现实。常见做法是分两类走:管理员批准的模板走 SharePoint 2007 的 stsadm,提交到服务器场级表单模板库;普通部门表单则直接通过前端站点上传到表单库,不必经过服务器命令行。
stsadm -o addformtemplate -filename "D:\Forms\ApprovalForm.xsn" -title "审批表单" -description "OA审批流程测试" stsadm -o activateformtemplate -url "http://oa.contoso.com/sites/hr" -filename "D:\Forms\ApprovalForm.xsn"参数说明:-filename 指向服务器本地 .xsn 路径;-title 是显示名称;-description 可选;activateformtemplate 的 -url 指定要启用这个模板的站点集合。执行前,确认执行账号在服务器上是场管理员(Farm Administrators),且 SharePoint 2007 管理中心里已经配置了 InfoPath Forms Services 默认状态。如果只做表单库下发,更简单的路径是直接用浏览器进入表单库设置 → 高级设置 → 上传模板,这一步适合不需要代码权限的模板。
部署后验证不能只看“上传成功”。在浏览器里打开一个基于该模板的新表单,确认页面没有出现“表单模板无法在浏览器中显示”的错误。这个错误的常见诱因有两种:模板发布目标选择了“InfoPath Filler”,而不是“浏览器兼容表单”;或者服务器场里 Forms Services 服务没有启动。这两条在报错日志里往往不会写得很直接,排查时先回设计器检查发布界面第二页的单选组。
3. InfoPath 2007 发布到 SharePoint 的两种路径与数据连接配置
3.1 管理员批准与用户直接发布:权限模型对比
InfoPath 2007 的发布路径在 Datasheet 里被称为 deployment options,实际部署时只有两种结果:发布到网站在线表单库,或者发布到管理中心模板库。这两种对应的升级方式完全不同。
| 发布路径 | 最低权限 | 模板存储位置 | 升级方式 | 适用场景 |
|---|---|---|---|---|
| 在线表单库 | 页面所有者 | 站点下的 Forms 文件夹 | 直接覆盖同名模板 | 部门级内部单据 |
| 管理中心模板库 | 服务器场管理员 | 服务器的 Forms 模板目录 | stsadm 或管理中心上传 | 全公司统一流程 |
首次发布选哪种取决于三个问题:这个表单的数据会不会跨站点读取,表单是否需要在浏览器中填写,还是只在 InfoPath Filler 客户端填写。浏览器填写必须使用场级模板库,这是 InfoPath 2007 的硬性限制;如果只是客户端填写,两种方式都能跑通。
权限边界是个经常被误解的点:发布到表单库并不意味着填写权限自动放开。表单库本身有自己的访问控制,而模板里的数据连接还带着自己的认证方式。所以生产环境里常见到的“表单能打开、数量加载不出”的故障,多半是数据连接的认证没有配置,而不是发布权限不够。
3.2 InfoPath 2007 三种数据连接的关键参数与写库坑点
InfoPath 2007 模板的数据连接有四种主要类型:XML 文档、SharePoint 列表、SQL Server 数据库和 Web 服务。前两种最常用,这里给出参数层面的注意点。
SharePoint 列表数据连接,在设计器里通过“数据连接 → 添加 → 新建连接 → 接收数据”创建,关键参数是站点地址、列表名称和站点语言。站点语言这一项经常被忽略,它影响列表字段的显示名称解析,语言不匹配时会出现字段无法映射的现象。SQL Server 连接的典型配置如下:
Provider=SQLOLEDB.1;Server=sql01\instance01;Database=HRForms;Integrated Security=SSPI;Connect Timeout=30参数说明:Provider 固定使用 SQLOLEDB.1;Server 带实例名时用反斜杠分隔;Integrated Security=SSPI 表示使用调用进程的 Windows 身份。InfoPath 2007 在这里有一个明显坑点——表单在本机 Filler 打开时走当前用户身份,一旦发布到 SharePoint 用浏览器打开,身份就变成了应用池账号,SQL 侧要预先授权这个账号,否则就会出现“本机测试正常、发布后报错”的经典事故。
把数据连接的超时从默认值改小是另一个调优点:在连接属性里将 DataObject 的 Timeout 设定为 15 秒,避免后端数据库慢查询时表单一直转圈。注意,InfoPath 2007 的二次数据源每次加载后都会缓存在表单内,同一个会话内的重复查询不会再打数据库。排查后端统计时,发现只有第一条查询记录,不一定是有问题,也可能命中缓存。想强制刷新,可以调用 DataSource.Query() 方法,但要在完全信任模式下才能用它。
提示:InfoPath 2007 的浏览器兼容表单对 SQL 直接数据连接支持有限,设计器发布前会给出兼容性检查结果,务必在发布向导最后一步查看“兼容性报告”。
3.3 完全信任与代码签名:InfoPath 2007 沙盒之外的部署
默认发布出来的 InfoPath 2007 模板运行在受限权限域,只能访问表单库本域数据。只要表单里有“访问外部 Web 服务”“读写本地文件”“调用 COM 组件”等需求,就得把安全级别提升为完全信任。
完全信任模板必须使用代码签名证书签名,没有签名的模板在客户端会弹出加载被拒绝的提示。开发环境里快速生成自签名证书的典型命令链如下:
makecert -r -pe -n "CN=HRForm Development" -b 01/01/2025 -e 12/31/2029 -sky exchange -ss my devcert.cer regform /R ApprovalForm.xsn参数说明:makecert 生成自签名证书,-r 表示根证书,-pe 导出私钥,-n 指定主题名称,-b 和 -e 是有效期;regform /R 将表单模板注册到本机 InfoPath,注册时读取 XSN 内嵌的签名信息。注意 -ss my 表示放入当前用户的证书存储区。证书安装到“受信任的根证书颁发机构”后,再发布到 SharePoint,表单才能加载完成。
这个阶段最容易被忽略的是签名顺序:先加代码,再签名,最后发布。如果发布后改了业务逻辑重新编译,却没有重新签名,模板文件会被 InfoPath 拒绝。服务器端的错误描述往往只显示通用签名错误代码,不告诉你签名和代码的时间戳不匹配。
4. InfoPath 2007 托管代码:事件、对象模型与 Web 服务提交
4.1 从设计器切换到 Visual Studio:InfoPath 2007 托管代码项目的构建起点
InfoPath 2007 支持两种代码模型:脚本(JScript 或 VBScript)和托管代码(C# 或 VB.NET)。托管代码不是把逻辑写在设计器里,而是在设计器中点击“工具 → 编程 → Microsoft Visual Studio Tools for Applications”后,设计器会在后台生成一个 .cs 项目,并把事件骨架放进 FormCode.cs。
这个文件里的主类以参数形式接收 XmlForm 对象,所有访问都从这个入口展开。打开文件后先看两个成员:DataSource 和 NamespaceManager。前者代表主数据源,后者持有表单 XML 的命名空间映射。这是接下来所有字段操作的基础。
一个容易踩的坑是项目类型。InfoPath 2007 设计器只识别当前机器上安装的 Office 2007 体系,如果机器上同时装了多个 Office 版本,Visual Studio Tools 的菜单项会消失。此时应优先安装与目标模板版本对应的 Office 2007 Primary Interop Assemblies,并调整项目的目标框架为 .NET 2.0。不要试图在 InfoPath 2013 的设计器里直接改 2007 的托管代码工程,两个版本的项目格式和程序集引用不一致会导致编译失败。
4.2 读字段、写字段:XPathNavigator 与 NamespaceManager 的最小可运行代码
字段访问是 InfoPath 2007 托管代码里最常见的场景,典型代码是:
public void FormEvents_Loading(object sender, LoadingEventArgs e) { XPathNavigator root = this.DataSource.CreateNavigator(); XPathNavigator empNode = root.SelectSingleNode( "/my:myFields/my:Employee/my:EmpName", this.NamespaceManager ); if (empNode != null && string.IsNullOrEmpty(empNode.Value)) { empNode.SetValue("默认员工姓名"); } }逻辑说明:FormEvents_Loading 在表单每次打开时触发;先拿主数据源创建 XPathNavigator,再按绝对 XPath 查找员工名字段;找到且为空时写入默认值。这里 SetValue 会触发表单的字段变化事件,并参与撤销记录。
参数说明:my: 前缀由 NamespaceManager 提供,它来自模板主命名空间的声明;XPath 路径必须严格与 InfoPath 设计器字段面板里的结构一致,如果字段位于重复表中,还要加上索引,例如 /my:myFields/my:Items/my:Item[1]/my:Name。使用 SelectSingleNode 时注意,它只返回第一个匹配节点,重复表的行数不确定时不能用来遍历;遍历应改用 Select 方法后迭代。
| 事件入口 | 触发时机 | 典型用途 |
|---|---|---|
| Loading | 表单打开时 | 初始化默认值、权限判断 |
| Submit | 用户点提交按钮时 | 数据校验、Web 服务调用 |
| AfterChange | 任意字段值变更后 | 联动计算、动态显示 |
这里要说明一个容易漏掉的情况:this.DataSource 指向的是主数据源,也就是 manifest.xsf 中声明为主表单数据的那个数据源。某些模板会在数据连接中额外创建独立数据源,并让视图与它绑定,此时 this.DataSource 返回的仍是主数据源,读取视图字段会失败,必须改用 this.DataSources 按名称索引。
注意:InfoPath 2007 的 NamespaceManager 区分大小写,节点名大小写不一致时 SelectSingleNode 返回 null,排查此类问题先看字段面板里的实际名称。
4.3 InfoPath 2007 Web 服务提交与错误处理参数
提交到 Web 服务的典型需求是把表单当做一个 SOAP 客户端,直接把 XML 提交给后端接口。InfoPath 2007 提供两种模式:在设计器中配置数据连接,或在代码中直接调用。设计器配置适用于接口字段固定、单次提交的场景,代码调用则适合需要权限校验、动态分支或多包提交的场景。
public void FormEvents_Submit(object sender, SubmitEventArgs e) { try { DataConnection conn = (DataConnection)this.DataConnections["HRSubmit"]; conn.Execute(); e.CancelableArgs.Cancel = false; } catch (Exception ex) { e.CancelableArgs.Cancel = true; this.UI.Alert("提交失败: " + ex.Message); } }参数说明:DataConnections["HRSubmit"] 的依据是设计器中“数据连接”面板里已配置的名称,字符串拼写必须完全一致,包括大小写;Execute 方法触发一次 Web 服务调用,成功或失败由异常类型体现。Cancel 属性决定是否终止提交操作:设为 true 时表单状态不会被标记为已提交,用户可继续编辑。UI.Alert 是在 InfoPath 2007 里向用户展示提示框的标准方法,不建议使用 MessageBox,后者在浏览器兼容表单中会被屏蔽。
日志记录是排查线上问题的关键补充,因为 Web 服务调用失败时,InfoPath 客户端只会显示一个通用错误。常见做法是在 catch 里追加一条本地日志到临时目录,但注意 InfoPath 2007 只有在完全信任模式下才能写文件系统。日志文件本身要按用户隔离,避免多用户冲突,文件名里带上当前用户的域账号是个可接受的方案。
5. 用日志验证表单逻辑与 InfoPath 2007 迁移路线
5.1 一个最小可用的日志辅助方法
在完全信任模板里,写日志不需要额外引用第三方库。把以下方法放在 FormCode.cs 的类中,即可在事件或规则里随时调用:
private void Log(string tag, string message) { string path = @"C:\Temp\InfoPath\" + Environment.UserDomainName + "_" + Environment.UserName + ".log"; System.IO.Directory.CreateDirectory(@"C:\Temp\InfoPath\"); System.IO.File.AppendAllText( path, string.Format("[{0:yyyy-MM-dd HH:mm:ss}] [{1}] {2}{3}", System.DateTime.Now, tag, message, System.Environment.NewLine) ); }参数说明:Directory.CreateDirectory 在目录已存在时不会报错,这在多用户共享机器的场景下是安全的;文件名以域账号区分,避免多个填写人同时打开表单时互相覆盖;AppendAllText 以追加方式写入,适合记录连续的操作轨迹。调用时在 Loading 事件里先写一条表单打开记录,再在 Submit 事件的成功和 catch 分支各写一条,一条表单的完整生命周期就串起来了。这个验证手段比 F5 单步调试更贴近真实生产环境,因为很多故障依赖表单库权限和服务器账号上下文,本机单步根本模拟不出来。
5.2 判断“迁移”还是“继续维护”的三个指标
InfoPath 2007 早已不在微软主流支持周期内,继续留在生产环境的唯一理由是业务逻辑稳定、无合规要求。遇到这些信号就要准备迁移:表单要新增签名流程、要支持移动浏览器、要对接 REST 接口,或者原设计人员已经找不到了。InfoPath 2013 可以打开 2007 模板做兼容性升级,但 2013 本身也已接近产品生命周期的尾声,并不推荐作为长期目标。
迁移选型上有三个判断指标:表单是否浏览器兼容、数据是否存在多表关联、填写过程是否有复杂校验。三者有任何一项,用 Power Apps 这类新平台重建的工作量都会增加一半以上。比较务实的做法,是先把表单的 XML schema 导出,用数据迁移工具把历史提交记录转到新平台的列表中,再手工重建界面。重建时不要逐控件对应,应该按“数据字段是否保留、计算逻辑是否保留、校验规则是否保留”三个维度重新设计,InfoPath 里的重复表和视图切换并没有直接等价物,硬搬只会得到一个操作别扭的替代品。迁移完成后的验收标准是:新旧平台各跑一个月的双轨期,每天对比提交记录总量和异常数量,确认无差异再关闭旧表单库的入口。
本文还有配套的精品资源,点击获取