如何在 .NET 中处理字段

如何在 .NET 中处理字段

本指南展示了如何在 Aspose.Words FOSS for .NET 中使用 Word 字段 — DATE、IF、REF、DATABASE 以及其他数十种 — :插入字段并读取其结果、在程序化编辑后更新字段、配置更新行为、使用回调跟踪更新,以及转换或删除字段。Aspose.Words FOSS for .NET 可通过 NuGet 获取,或通过源码构建。

分步指南

步骤 1:获取库

克隆仓库并构建 Aspose.Words.sln 在 Release 配置下,然后添加项目引用到 Aspose.Words.csproj 从您自己的 .NET 项目中,如在 安装指南。添加 using Aspose.Words; and using Aspose.Words.Fields; 在任何使用字段的文件顶部添加。


步骤 2:插入字段并读取其结果

DocumentBuilder.InsertField() 在光标处插入一个新字段,提供的重载可以立即更新字段的结果,或留待稍后更新。每个字段都是一个由三个标记节点 — FieldStart、Separator、FieldEnd 组成的 Field 实例,分别以 Field.Start / Field.Separator / Field.End 公开。Field.Type 确定它代表的 FieldType,Field.Result 和 Field.DisplayResult 保存最后计算的值,Field.Format 保存附加在代码上的任何格式开关,Field.GetFieldCode() 返回原始字段代码文本。


步骤 3:在程序化编辑后更新字段

Aspose.Words FOSS 在文档加载或保存时不会重新计算字段。 在应该更改字段结果的编辑之后,调用 Range.UpdateFields() 重新计算该范围内的所有字段——对整个文档使用 Document.Range.UpdateFields()——或对单个字段使用 Field.Update()。 Range.UnlinkFields() 在一次调用中将该范围内的所有字段转换为静态文本,Range.NormalizeFieldTypes() 在手动编辑后将字段的存储类型代码与实际字段代码进行对齐。


步骤 4:使用 FieldOptions 配置字段更新行为

Document.FieldOptions(一个 FieldOptions 实例)控制文档整体在更新过程中的字段行为:CurrentUser(一个 UserInformation 实例——Name、Initials、Address)提供作者和用户名相关字段读取的身份标识,DefaultDocumentAuthor 为作者相关结果提供种子,LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource 控制数字和日期的格式。对于无人值守的流水线,分配 FieldOptions.UserPromptRespondent(一个 IFieldUserPromptRespondent),以防止像 ASK 和 FILLIN 这类提示驱动的字段因交互式输入而阻塞,并为 FieldOptions.FieldDatabaseProvider 分配自定义的 IFieldDatabaseProvider,以便从您自己的数据源而非真实数据库连接提供 DATABASE 字段的行。


步骤 5:使用回调跟踪字段更新

实现 IFieldUpdatingCallback(FieldUpdating 和 FieldUpdated),并将其分配给 FieldOptions,以在每次字段重新计算之前和之后立即运行代码——这对于审计批处理作业中具体哪些字段发生了变化非常有用。对于跨大型文档的进度报告,实现 IFieldUpdatingProgressCallback(Notify),它接收一个 FieldUpdatingProgressArgs,该对象公开 TotalFieldsCount、UpdatedFieldsCount 和 UpdateCompleted。


步骤 6:转换或删除字段

Field.Unlink() 将字段替换为其最后计算的结果,作为普通的静态文本,丢弃底层的字段代码——当您希望该值永久写入文档时使用它。Field.Remove() 删除 FieldStart、Separator 和 FieldEnd 节点以及字段的代码和结果,彻底移除字段。相比直接删除标记节点,更建议使用这两种方法,因为手动只删除字段结构的一部分可能导致文档树不一致。

常见问题与解决方案

编辑文档后,字段的显示结果会变得陈旧。 Aspose.Words FOSS 在加载或保存时不会自动更新字段。调用 Range.UpdateFields() or Field.Update() 在编辑后明确地。

PAGE, NUMPAGES,或目录页码始终显示 0. 页面布局/渲染不属于此版本,因此结果取决于分页的字段会评估为占位符 0. 这是此版本中的预期行为。

批量字段更新似乎卡住了。 提示驱动字段(ASK, FILLIN)没有 IFieldUserPromptRespondent 已分配。分配 FieldOptions.UserPromptRespondent, 或设置 DefaultResponse 在单个字段实例上。

该 DATABASE 字段未生成任何行。 没有 IFieldDatabaseProvider 已分配给 FieldOptions.FieldDatabaseProvider. 实现接口并在调用前分配它 Range.UpdateFields().

常见问答

Aspose.Words FOSS 是否评估所有 Word 字段类型?

Field 对象模型表示每个 FieldType 值并更新其中大多数,但其结果依赖于页面布局——例如 PAGE 和 NUMPAGES——会评估为占位符 0,因为此版本不包含布局/渲染引擎。

在程序化编辑后,我如何重新评估字段?

对覆盖已编辑内容的范围调用 Range.UpdateFields(),或者对整个文档调用 Document.Range.UpdateFields()。

我可以将字段转换为普通的静态文本吗?

是的——Field.Unlink() 会用其最后计算的结果替换字段,作为普通文本。

我如何彻底删除字段,包括其结果?

调用 Field.Remove()。它会删除 FieldStart、Separator 和 FieldEnd 节点,以及字段的代码和结果内容。

我如何向 DATABASE 字段提供自定义数据?

实现 IFieldDatabaseProvider 并将其分配给 Document.FieldOptions.FieldDatabaseProvider。它的 GetQueryResult() 实现返回一个由 FieldDatabaseDataRow 实例构建的 FieldDatabaseDataTable。

另请参阅

 中文