Moinsen,
ich habe ein paar Methoden gebaut, die in einem docx-Dokument den Text der Kopf- und Fußzeilen austauschen, im Prinzip so als wenn man dort ein Seriendruckfeld platzieren könnte. In der Dokumentenvorlage wird der Schlüssel (im Beispiel INFTitel) in die Kopfzeile eingetragen, der Code soll das dann durch einen anderen Text ersetzen. Mit den Fußzeilen funzt das auch, nur die Kopfzeile weigert sich, obwohl der ausgetauschte Text im OpenXML steht (siehe angehängtes Bild)
private void Process<T>(WordprocessingDocument doc, T data) {
var main = doc.MainDocumentPart.Document;
DataProperties<T> dp = new DataProperties<T>(data);
// data ist die Datenklasse, aus diesen Daten wird das Dokument befüllt
// DataProperties<T> besorgt letzendlich die benötigten Werte
// Kopf und Fußzeilen
var header = doc.MainDocumentPart.HeaderParts;
var footer = doc.MainDocumentPart.FooterParts;
this.PreProcessHeader(header, dp);
this.PreProcessFooter(footer, dp);
....
....
}
private void PreProcessHeader<T>(IEnumerable<HeaderPart> header, DataProperties<T> dp) {
foreach (var h in header) {
this.ProcessHeaderOrFooter(h.Header, dp);
h.Header.Save();
}
}
private void PreProcessFooter<T>(IEnumerable<FooterPart> footer, DataProperties<T> dp) {
foreach (var f in footer) {
this.ProcessHeaderOrFooter(f.Footer, dp);
f.Footer.Save();
}
}
private void ProcessHeaderOrFooter<T1, T2>(T1 element, DataProperties<T2> dp) where T1 : OpenXmlElement {
var textNodes = element.Descendants<Text>();
foreach (var t in textNodes.Where(p=> p.Text!=null && p.Text.StartsWith("INF")==true)) {
FieldProperties fp = new FieldProperties(t.Text);
// ermittelt Feldnamen der Mergefields, Formatstrings etc aus dem Dokument
t.Text = dp.GetValue(fp);
// dp.GetValue holt aus der Datenklasse den Wert der Property, der ins Dokument geschrieben werden soll
}
}
Wie gesagt, Fußzeile passt, Kopfzeile nicht, da wird immer der Platzhalter angezeigt, der übrigens in
doc.PackageProperties.Title
steht.
Und genau dieser Titel wird ins Dokument geschrieben, warum auch immer.
Grüße
Christian