Wie man mit Feldern in .NET arbeitet
Dieses Handbuch zeigt, wie man mit Word-Feldern — DATE, IF, REF, DATABASE und Dutzenden weiterer — in Aspose.Words FOSS für .NET arbeitet: Einfügen eines Feldes und Auslesen seines Ergebnisses, Aktualisieren von Feldern nach einer programmatischen Bearbeitung, Konfigurieren des Aktualisierungsverhaltens, Verfolgen von Updates mit einem Callback und Konvertieren oder Entfernen eines Feldes. Aspose.Words FOSS für .NET ist über NuGet oder durch Kompilieren aus dem Quellcode verfügbar.
Schritt-für-Schritt-Anleitung
Schritt 1: Bibliothek erhalten
Klonen Sie das Repository und bauen Sie es Aspose.Words.sln in Release-Konfiguration, dann fügen Sie einen Projektverweis zu Aspose.Words.csproj aus Ihrem eigenen .NET-Projekt, wie im Installationshandbuch. Hinzufügen using Aspose.Words; and using Aspose.Words.Fields; am Anfang jeder Datei, die mit Feldern arbeitet.
Schritt 2: Feld einfügen und Ergebnis auslesen
DocumentBuilder.InsertField() fügt am Cursor ein neues Feld ein, mit Überladungen, die entweder das Ergebnis des Feldes sofort aktualisieren oder für einen späteren Aktualisierungslauf zurückhalten. Jedes Feld ist eine Field-Instanz, die aus drei Markerknoten besteht — FieldStart, Separator und FieldEnd, die als Field.Start / Field.Separator / Field.End zugänglich sind. Field.Type identifiziert, welches FieldType es darstellt, Field.Result und Field.DisplayResult enthalten den zuletzt berechneten Wert, Field.Format enthält etwaige Format-Schalter, die dem Code angehängt sind, und Field.GetFieldCode() liefert den rohen Feldcode-Text zurück.
Schritt 3: Felder nach einer programmgesteuerten Bearbeitung aktualisieren
Aspose.Words FOSS berechnet Felder nicht neu, wenn das Dokument geladen oder gespeichert wird. Nach einer Bearbeitung, die das Ergebnis eines Feldes ändern sollte, rufen Sie Range.UpdateFields() auf, um jedes Feld in diesem Bereich neu zu berechnen — verwenden Sie Document.Range.UpdateFields() für das gesamte Dokument — oder Field.Update() für ein einzelnes Feld. Range.UnlinkFields() konvertiert jedes Feld im Bereich in statischen Text in einem Aufruf, und Range.NormalizeFieldTypes() stimmt den gespeicherten Typcode eines Feldes mit seinem tatsächlichen Feldcode nach einer manuellen Bearbeitung ab.
Schritt 4: Das Aktualisierungsverhalten von Feldern mit FieldOptions konfigurieren
Document.FieldOptions (eine FieldOptions-Instanz) steuert, wie sich die Felder des gesamten Dokuments während eines Updates verhalten: CurrentUser (eine UserInformation-Instanz — Name, Initials, Address) liefert die Identität, aus der autor- und benutzernamebezogene Felder lesen, DefaultDocumentAuthor liefert die Ergebnisse für Autoren, und LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource steuern die Zahlen- und Datumsformatierung. Für unbeaufsichtigte Pipelines weisen Sie FieldOptions.UserPromptRespondent (ein IFieldUserPromptRespondent) zu, damit promptgesteuerte Felder wie ASK und FILLIN nicht blockieren und auf interaktive Eingaben warten, und weisen Sie ein benutzerdefiniertes IFieldDatabaseProvider FieldOptions.FieldDatabaseProvider zu, um die Zeilen des DATABASE-Feldes aus Ihrer eigenen Datenquelle statt einer echten Datenbankverbindung zu beziehen.
Schritt 5: Feldaktualisierungen mit einem Callback verfolgen
Implementieren Sie IFieldUpdatingCallback (FieldUpdating und FieldUpdated) und weisen Sie es FieldOptions zu, um Code unmittelbar vor und nach jeder Neuberechnung eines Feldes auszuführen – nützlich, um genau zu protokollieren, welche Felder in einem Batch-Job geändert wurden. Für Fortschrittsberichte über ein großes Dokument implementieren Sie IFieldUpdatingProgressCallback (Notify), das ein FieldUpdatingProgressArgs erhält, das TotalFieldsCount, UpdatedFieldsCount und UpdateCompleted offenlegt.
Schritt 6: Ein Feld konvertieren oder entfernen
Field.Unlink() ersetzt das Feld durch sein zuletzt berechnetes Ergebnis als gewöhnlichen statischen Text und verwirft den zugrunde liegenden Feldcode – verwenden Sie es, wenn Sie den Wert dauerhaft im Dokument verankern möchten. Field.Remove() löscht die FieldStart-, Separator- und FieldEnd-Knoten zusammen mit dem Feldcode und Ergebnis und entfernt das Feld vollständig. Bevorzugen Sie diese beiden Methoden gegenüber dem direkten Löschen der Marken-Knoten, da das manuelle Entfernen nur eines Teils der Feldstruktur das Dokumenten-Baum inkonsistent machen kann.
Häufige Probleme und Lösungen
Das angezeigte Ergebnis eines Feldes ist nach dem Bearbeiten des Dokuments veraltet. Aspose.Words FOSS aktualisiert Felder beim Laden oder Speichern nicht automatisch. Rufen Sie Range.UpdateFields() or Field.Update() explizit nach der Bearbeitung.
PAGE, NUMPAGES, oder eine Seitenzahl des Inhaltsverzeichnisses wird immer angezeigt 0. Seitenlayout/-Rendering ist nicht Teil dieser Ausgabe, daher werden Felder, deren Ergebnis von der Seitennummerierung abhängt, zu einem Platzhalter ausgewertet 0. Dies ist das erwartete Verhalten in dieser Ausgabe.
Ein Batch-Feldupdate scheint zu hängen. Ein promptgesteuertes Feld (ASK, FILLIN) hat keinen IFieldUserPromptRespondent zugewiesen. Zuweisen FieldOptions.UserPromptRespondent, oder setzen DefaultResponse auf die einzelne Feldinstanz.
Der DATABASE Feld erzeugt keine Zeilen. Keine IFieldDatabaseProvider ist zugewiesen an FieldOptions.FieldDatabaseProvider. Implementieren Sie das Interface und weisen Sie es zu, bevor Sie aufrufen Range.UpdateFields().
Häufig gestellte Fragen
Wertet Aspose.Words FOSS jeden Word-Feldtyp aus?
Das Field-Objektmodell repräsentiert jeden FieldType-Wert und aktualisiert die meisten davon, aber Felder, deren Ergebnis vom Seitenlayout abhängt – wie PAGE und NUMPAGES – werden zu einem Platzhalter-0 ausgewertet, weil diese Ausgabe nicht die Layout-/Render-Engine enthält.
Wie kann ich Felder nach einer programmatischen Bearbeitung neu auswerten?
Rufen Sie Range.UpdateFields() für den Bereich auf, der den bearbeiteten Inhalt umfasst, oder Document.Range.UpdateFields() für das gesamte Dokument.
Kann ich ein Feld in einfachen, statischen Text umwandeln?
Ja — Field.Unlink() ersetzt das Feld durch sein zuletzt berechnetes Ergebnis als normalen Text.
Wie entferne ich ein Feld vollständig, einschließlich seines Ergebnisses?
Rufen Sie Field.Remove() auf. Es löscht die FieldStart, Separator und FieldEnd Knoten zusammen mit dem Code und dem Ergebnisinhalt des Feldes.
Wie kann ich dem DATABASE-Feld benutzerdefinierte Daten bereitstellen?
Implementiere IFieldDatabaseProvider und weise es Document.FieldOptions.FieldDatabaseProvider zu. Seine GetQueryResult() Implementierung gibt ein FieldDatabaseDataTable zurück, das aus FieldDatabaseDataRow Instanzen gebaut ist.