Comment travailler avec les champs dans .NET
Ce guide montre comment travailler avec les champs Word — DATE, IF, REF, DATABASE et des dizaines d’autres — dans Aspose.Words FOSS pour .NET : insérer un champ et lire son résultat, mettre à jour les champs après une modification programmatique, configurer le comportement de mise à jour, suivre les mises à jour avec un rappel, et convertir ou supprimer un champ. Aspose.Words FOSS pour .NET est disponible via NuGet ou en le compilant à partir du code source.
Guide étape par étape
Étape 1: obtenir la bibliothèque
Clonez le dépôt et compilez Aspose.Words.sln en configuration Release, puis ajoutez une référence de projet à Aspose.Words.csproj de votre propre projet .NET, comme décrit dans le Guide d’installation. Ajoutez using Aspose.Words; and using Aspose.Words.Fields; au début de tout fichier qui travaille avec des champs.
Étape 2: insérer un champ et lire son résultat
DocumentBuilder.InsertField() insère un nouveau champ au curseur, avec des surcharges qui mettent soit à jour le résultat du champ immédiatement, soit le laissent pour un passage de mise à jour ultérieur. Chaque champ est une instance Field composée de trois nœuds marqueurs — FieldStart, Separator et FieldEnd, exposés comme Field.Start / Field.Separator / Field.End. Field.Type identifie quel FieldType il représente, Field.Result et Field.DisplayResult contiennent la dernière valeur calculée, Field.Format contient les commutateurs de format attachés au code, et Field.GetFieldCode() renvoie le texte brut du code du champ.
Étape 3: Mettre à jour les champs après une modification programmatique
Aspose.Words FOSS ne recalcule pas les champs lors du chargement ou de l’enregistrement du document. Après une modification qui devrait changer le résultat d’un champ, appelez Range.UpdateFields() pour recalculer chaque champ dans cette plage — utilisez Document.Range.UpdateFields() pour l’ensemble du document — ou Field.Update() pour un seul champ. Range.UnlinkFields() convertit chaque champ de la plage en texte statique en un seul appel, et Range.NormalizeFieldTypes() réconcilie le code de type stocké d’un champ avec son code de champ réel après une modification manuelle.
Étape 4: Configurer le comportement de mise à jour des champs avec FieldOptions
Document.FieldOptions (une instance FieldOptions) contrôle la façon dont les champs de l’ensemble du document se comportent pendant une mise à jour: CurrentUser (une instance UserInformation — Name, Initials, Address) fournit l’identité dont lisent les champs liés aux noms d’auteur et d’utilisateur, DefaultDocumentAuthor alimente les résultats liés à l’auteur, et LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource contrôlent le formatage des nombres et des dates. Pour les pipelines non supervisés, affectez FieldOptions.UserPromptRespondent (un IFieldUserPromptRespondent) afin que les champs guidés par des invites comme ASK et FILLIN ne bloquent pas en attendant une saisie interactive, et assignez un IFieldDatabaseProvider personnalisé à FieldOptions.FieldDatabaseProvider pour fournir les lignes du champ DATABASE depuis votre propre source de données au lieu d’une vraie connexion à une base de données.
Étape 5: Suivre les mises à jour des champs avec un rappel
Implémentez IFieldUpdatingCallback (FieldUpdating et FieldUpdated) et affectez-le à FieldOptions pour exécuter du code immédiatement avant et après chaque recalcul de champ — utile pour auditer exactement quels champs ont changé dans un travail par lots. Pour le reporting de progression dans un document volumineux, implémentez IFieldUpdatingProgressCallback (Notify), qui reçoit un FieldUpdatingProgressArgs exposant TotalFieldsCount, UpdatedFieldsCount et UpdateCompleted.
Étape 6: Convertir ou supprimer un champ
Field.Unlink() remplace le champ par son dernier résultat calculé sous forme de texte statique ordinaire, en éliminant le code de champ sous-jacent — utilisez-le lorsque vous souhaitez que la valeur soit incorporée de façon permanente dans le document. Field.Remove() supprime les nœuds FieldStart, Separator et FieldEnd ainsi que le code et le résultat du champ, supprimant le champ entièrement. Privilégiez ces deux méthodes plutôt que de supprimer directement les nœuds marqueurs, car enlever manuellement seulement une partie de la structure d’un champ peut rendre l’arbre du document incohérent.
Problèmes courants et solutions
Le résultat affiché d’un champ est périmé après la modification du document. Aspose.Words FOSS ne met pas à jour automatiquement les champs au chargement ou à l’enregistrement. Appelez Range.UpdateFields() or Field.Update() explicitement après la modification.
PAGE, NUMPAGES, ou un numéro de page de la table des matières s’affiche toujours 0. La mise en page/rendu ne fait pas partie de cette édition, donc les champs dont le résultat dépend de la pagination sont évalués à un espace réservé 0. C’est le comportement attendu dans cette édition.
Une mise à jour groupée de champs semble se bloquer. Un champ piloté par invite (ASK, FILLIN) n’a aucun IFieldUserPromptRespondent assigné. Assigner FieldOptions.UserPromptRespondent, ou définir DefaultResponse sur l’instance de champ individuelle.
Le DATABASE champ ne produit aucune ligne. Aucun IFieldDatabaseProvider est attribué à FieldOptions.FieldDatabaseProvider. Implémentez l’interface et affectez-la avant d’appeler Range.UpdateFields().
Foire aux questions
Est-ce que Aspose.Words FOSS évalue chaque type de champ Word?
Le modèle d’objet Field représente chaque valeur FieldType et met à jour la plupart d’entre elles, mais les champs dont le résultat dépend de la mise en page — tels que PAGE et NUMPAGES — évaluent à un 0 de substitution parce que cette édition n’inclut pas le moteur de mise en page/rendu.
Comment réévaluer les champs après une modification programmatique ?
Appelez Range.UpdateFields() sur la plage qui couvre le contenu modifié, ou Document.Range.UpdateFields() pour l’ensemble du document.
Puis-je convertir un champ en texte simple et statique ?
Oui — Field.Unlink() remplace le champ par son dernier résultat calculé sous forme de texte ordinaire.
Comment supprimer complètement un champ, y compris son résultat ?
Appelez Field.Remove(). Il supprime les nœuds FieldStart, Separator et FieldEnd ainsi que le code du champ et le contenu du résultat.
Comment fournir des données personnalisées au champ DATABASE ?
Implémentez IFieldDatabaseProvider et assignez-le à Document.FieldOptions.FieldDatabaseProvider. Son implémentation GetQueryResult() renvoie un FieldDatabaseDataTable construit à partir d’instances FieldDatabaseDataRow.