Veröffentlicht 11. Februar 20223 j 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(); } } } } } Â
14. Februar 20223 j 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(); Â
14. Februar 20223 j Autor Hi, die beiden Zeilen settingsPart.Settings.Save(); doc.MainDocumentPart.Document.Save(); reichen leider nicht aus. Das Feld bleibt bis zum aktualisieren der Feldverweise leer.
14. Februar 20223 j 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 20223 j von ihkaka xml fix
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.