Laden...

docx Dokument / OpenXML - text der Kopfzeile ändern

Erstellt von chriscolm vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.010 Views
C
chriscolm Themenstarter:in
112 Beiträge seit 2009
vor 11 Jahren
docx Dokument / OpenXML - text der Kopfzeile ändern

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