.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() はカーソル位置に新しいフィールドを挿入します。オーバーロードにより、フィールドの結果を即座に更新するか、後の更新パスに回すかを選択できます。すべてのフィールドは Field インスタンスで、FieldStart、Separator、FieldEnd の3つのマーカーノードから構成され、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 のようなプロンプト駆動フィールドが対話入力を待つことによるブロックを防ぎ、IFieldDatabaseProvider をカスタムで FieldOptions.FieldDatabaseProvider に割り当て、実際のデータベース接続ではなく独自のデータソースから 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 フィールドに供給するにはどうすればよいですか?

Implement IFieldDatabaseProvider を実装し、Document.FieldOptions.FieldDatabaseProvider に割り当てます。その GetQueryResult() 実装は、FieldDatabaseDataRow インスタンスから構築された FieldDatabaseDataTable を返します。

参照

 日本語