Zum Inhalt springen

Felder einer Word-Datei per DocumentFormat.OpenXml


Empfohlene Beiträge

Geschrieben

Hallo in die Runde,

ich bin gerade dabei etwas mit Word-Dateien mittels DocumentFormat.OpenXml abseits der Interop-Welt zu arbeiten. 

Nun bin ich dabei Felder zu aktualisieren. Built-In Felder, wie Title und Company lassen sich relativ leicht über die ExptendedFileProperties bzw PackageProperties ändern.

Bei selbst erstellten Feldern kann ich diese zwar ändern, aber ich muss in den Einstellungen anschließend die Property UpdateFieldsOnOpen setzen, damit die Änderung sichtbar werden.

Meine Frage hierzu lautet nun: Kann ich das beim bearbeiten des Openxml direkt machen, ohne dass der Benutzer beim öffnen Dialoge zum Aktualisieren der Felder bestätigen muss?

Hier mein Beispielcode dazu:

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.CustomProperties;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.VariantTypes;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Linq;

namespace TestNamespace
{
    class WordProcessing
    {
        public void DoWork()
        {
            using (var doc = WordprocessingDocument.Open("FILENAME.DOCX", true))
            {
                doc.ExtendedFilePropertiesPart.Properties.Company.Text = "NEW COMPANY";
                doc.PackageProperties.Title = "NEW TITLE";
                var prop = doc.CustomFilePropertiesPart.Properties.OfType<CustomDocumentProperty>().FirstOrDefault(f => f.Name.Value == "TEST");
                if (prop != null)
                {
                    prop.VTLPWSTR = new VTLPWSTR("NEW VALUE");
                }
              
                var settingsPart = doc.MainDocumentPart.GetPartsOfType<DocumentSettingsPart>().FirstOrDefault();
                if (settingsPart != null)
                {
                    var updateFields = new UpdateFieldsOnOpen();
                    updateFields.Val = new OnOffValue(true);

                    settingsPart.Settings.PrependChild<UpdateFieldsOnOpen>(updateFields);
                    settingsPart.Settings.Save();
                }
            }
        }
    }
}

 

Geschrieben
Am 11.2.2022 um 11:34 schrieb Mttkrb:

 

settingsPart.Settings.Save();

 

Das alleine sollte ausreichen um die Änderung durchzuführen, ohne UpdateFieldsOnOpen und ohne PrependChild methode. UpdateFieldsOnOpen ist gerade das was du nicht haben willst.

Es kann sein, daß die Ursprungdatei schon Verknüpfungen hat und die werden in die neue mit übernommen. In der Doku wird auch das Format und die pid erwähnt, damit es unter Word 2010 und 2013 klappt, aber bei mir gehts auch ohne unter Word2019.

Hier ausführlicher in der Doku:

    <op:Properties xmlns:vt="https://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" xmlns:op="https://schemas.openxmlformats.org/officeDocument/2006/custom-properties">
      <op:property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="Manager">
        <vt:lpwstr>Mary</vt:lpwstr>
      </op:property>
      <op:property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="3" name="ReviewDate">
        <vt:filetime>2010-12-21T00:00:00Z</vt:filetime>
      </op:property>
    </op:Properties>
https://docs.microsoft.com/en-us/office/open-xml/how-to-set-a-custom-property-in-a-word-processing-document

 

Kannst versuchen noch den MainDocumentPart abzuspeichern, ich denke aber es ist überflüssig weil hat nix mit den CustomProperties zu tun.

doc.MainDocumentPart.Document.Save();

 

Geschrieben

Hi,

die beiden Zeilen

settingsPart.Settings.Save();
doc.MainDocumentPart.Document.Save();

reichen leider nicht aus. Das Feld bleibt bis zum aktualisieren der Feldverweise leer.

Geschrieben (bearbeitet)

Wie checkst du ob die Werte übernommen wurden ?

Mach ma folgendes:

-Speichere die FILENAME.DOCX als FILENAME.ZIP

-Öffne die FILENAME.ZIP, geh ins "FILENAME.zip\docProps" Verzeichnis

-Drin findest du die "FILENAME.zip\docProps\custom.xml"

In der custom.xml sind alle selbst erstellten Felder, die dein Code produziert:

<?xml version="1.0" encoding="UTF-8"?>
<op:Properties xmlns:op="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties">
	<op:property name="TEST" pid="2" fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}">
		<vt:lpwstr xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">NEW VALUE</vt:lpwstr>
	</op:property>
</op:Properties>
Bearbeitet von ihkaka
xml fix

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...