Mttkrb Geschrieben 11. Februar 2022 Teilen Geschrieben 11. Februar 2022 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(); } } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast Geschrieben 14. Februar 2022 Teilen Geschrieben 14. Februar 2022 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(); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 14. Februar 2022 Autor Teilen Geschrieben 14. Februar 2022 Hi, die beiden Zeilen settingsPart.Settings.Save(); doc.MainDocumentPart.Document.Save(); reichen leider nicht aus. Das Feld bleibt bis zum aktualisieren der Feldverweise leer. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast Geschrieben 14. Februar 2022 Teilen Geschrieben 14. Februar 2022 (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 14. Februar 2022 von ihkaka xml fix Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.