Laden...

Zwei Word Dokumente zusammenführen bzw. ein Dokument in das andere kopieren

Erstellt von GrafWasserrutsche vor 10 Jahren Letzter Beitrag vor 10 Jahren 5.990 Views
G
GrafWasserrutsche Themenstarter:in
20 Beiträge seit 2013
vor 10 Jahren
Zwei Word Dokumente zusammenführen bzw. ein Dokument in das andere kopieren

Hallo zusammen,

ich suche jetzt schon seit einiger Zeit eine Lösung für mein Problem, bin aber leider nur geringfügig weitergekommen. Dabei muss ich noch sagen, dass meine C# Skills aktuell noch eher spärlich gesät sind.

Also, zu meinem Problem:

Ich habe ein Word Dokument, was den eigentlichen Inhalt eines Schreibens enthält. Also Betreff, Text, Grußformel etc.. Parallel dazu habe ich ein Word Dokument, welches den Briefkopf, die Fußzeile und ein paar weitere Design-Elemente enthält. Jetzt würde ich diese gerne kombinieren und suche hier den praktikabelsten Weg.

Hierzu habe ich nach Googleei quasi folgenden Code gefunden (Die Kommentare habe ich jetzt mal so hinzugefügt, wie ich sie verstehe. Sollte hier etwas grundsätzlich falsch sein, würde ich mich über eine Korrektur sehr freuen!):

// Word Instanz starten
Word.Application oWord = new Word.Application();
oWord.Visible = true;

// Word Dokument initialisieren
Word.Document oWordDoc = new Word.Document();

// Objekte für Prozeduraufruf initialisieren
Object missing = System.Reflection.Missing.Value;
Object templatePath = @"D:\Brief_leer.docx";
Object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges; 

// Ein Word Dokument öffnen
oWordDoc = oWord.Documents.Add(ref templatePath, ref missing, ref missing, ref missing);

// Gesamtes Dokument markieren, kopieren und selektieren
oWordDoc.ActiveWindow.Selection.WholeStory();
oWordDoc.ActiveWindow.Selection.Copy();

// Leeres Dokument markieren und Zwischenspeicher einfügen
oWord.ActiveDocument.Select();
oWordDoc.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdPasteDefault);

// Neu generiertes Dokument in den Fokus legen
oWord.Activate();

Hierbei nehme ich mir ja, wenn ich es richtig verstanden habe, den Inhalt eines Dokuments, markiere dieses quasi ganz und füge es in ein leeres Dokument ein, ist das korrekt? Der Code läuft bei mir auch ganz normal durch und ich erhalte ein "Dokument2" mit dem Inhalt des Quelldokuments.

Wie müsste ich das jetzt ergänzen oder umarbeiten, damit ich den Text in ein bestehendes Dokument bekomme? Oder hab ich hier grundsätzlich falsch gedacht? Hatte bereits versucht dem ursprünglich initialisierten Dokument direkt das Zieldokument zu öffnen, aber irgendwie will das noch nicht richtig funktionieren.

Ich hoffe, ich habe mich auch in allen Bereichen richtig ausgedrückt. Hat jemand Tipps oder Lesestoff für mich, mit dem ich hier ein wenig weiterkommen könnte? Wäre super! Vielen Dank!

Gruß

Micha

R
212 Beiträge seit 2012
vor 10 Jahren

Im ansatz ist deine lösung nicht falsch. Du makerst ja immer das ganze dokument und fügst es dann in das 2. ein.

Das 2. dokument erstellst du jedoch neu wudurch nochnichts im 2. dokument enthalten ist.

Wenn du 2 Dokumente in ein 3. zusammenfügen möchtest schau dir bitte an wie man per C# in MsOfficeWord text formatiert bzw. bearbeitet.

Mein tipp für dich ist:
Lies aus beiden Dokumenten den string aus und kombiniere diese wie du magst, dann fügst du den text in ein 3. dokument ein und formatierst diesen.

Auslesen kannst du ja schon
is zwar auf englisch aber es wird gut erklärt wie du den text formatieren kannst.
How to: Programmatically Format Text in Documents

G
GrafWasserrutsche Themenstarter:in
20 Beiträge seit 2013
vor 10 Jahren

Im ansatz ist deine lösung nicht falsch. Du makerst ja immer das ganze dokument und fügst es dann in das 2. ein.

Das 2. dokument erstellst du jedoch neu wudurch nochnichts im 2. dokument enthalten ist.

Wenn du 2 Dokumente in ein 3. zusammenfügen möchtest schau dir bitte an wie man per C# in MsOfficeWord text formatiert bzw. bearbeitet.

Mein tipp für dich ist:
Lies aus beiden Dokumenten den string aus und kombiniere diese wie du magst, dann fügst du den text in ein 3. dokument ein und formatierst diesen.

Auslesen kannst du ja schon
is zwar auf englisch aber es wird gut erklärt wie du den text formatieren kannst.

>

Ah, super, das schau ich mir mal an, dankeschön! Teilweise sind in den Dokumenten aber auch Formularfelder, Dropdownfelder etc.. Gibt es dafür auch irgendeine Möglichkeit? Könnte ich das, vom Prinzip her, hiermit auch realisieren?

R
212 Beiträge seit 2012
vor 10 Jahren

Klar du kannst mit C# in Word sogut wie alles machen was du auch in Word direkt machen kannst:

http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.dropdownlistcontentcontrol.aspx

G
GrafWasserrutsche Themenstarter:in
20 Beiträge seit 2013
vor 10 Jahren

So, jetzt sind die Anforderungen etwas anders geworden. Es wird jetzt gewünscht, dass die Dokumente selber weiterhin von einer Sekretärin gepflegt werden sollen. D.h. ich kann nicht mit einer festen Formatierung arbeiten. Es sollen auch ständig Dokumente dazu kommen oder evtl. auch gelöscht werden.

Gibt es definitiv keinen anderen Weg? Einfach nur eines ins andere kopieren? Vielleicht denk ich da auch einfach noch nicht weit genug und zu einfach gestrickt.

Als Alternative (Absolut keine Ahnung ob das praktikabel ist oder nicht) habe ich mir gedacht, dass man die Dokumenten-Elemente ja in so einer art eigenen Scriptsprache abspeichern könnte. Also innerhalb des Programms kann man dann etwas schreiben wie

<BETREFF>
<LEER>
<DROPDOWN>Punkt1,Punkt2,Punkt3
<TEXT>Sehr geehrte Damen und Herren, blaw blaw blaw

und die Sachen werden dann einfach von mir selbst in die zu erstellenden Word-Inhaltselemente übersetzt.

Dann müssten sich die entsprechenden Personen nur da ein wenig einarbeiten.

Oder wäre das totaler Quatsch?

G
GrafWasserrutsche Themenstarter:in
20 Beiträge seit 2013
vor 10 Jahren

So, ich bin jetzt soweit, dass ich zumindest alles in Textform in das andere Dokument rüber bekomme. Ich habe im Quelldokument vor und hinter den Text ein Bookmarks hinzugefügt und kopiere mir die Range.

// Ende des ersten Bookmarks auslesen & Anfang des zweiten Bookmarks auslesen
Word.Range rngFirstBookmark = sourceDoc.Bookmarks.get_Item(ref bookmarkBegin).Range;
object firstBookmarkEnd = rngFirstBookmark.End;

Word.Range rngSecondBookmark = sourceDoc.Bookmarks.get_Item(ref bookmarkEnd).Range;
object secondBookmarkStart = rngSecondBookmark.Start;

// Inhalt zwischen den Bookmarks kopieren
Word.Range rngTarget = sourceDoc.Range(ref firstBookmarkEnd, ref secondBookmarkStart);

// Zu Textmarke in Template-Datei springen und Text einfügen
object docAction = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToBookmark;
object docTarget = "TextBegin";

wordApp.Selection.GoTo(ref docAction, ref n, ref n, ref docTarget);
wordApp.Selection.TypeText(rngTarget.Text);

Wenn ich das folgendermaßen kopiere, werden die Auswahlfelder, Textfelder etc. aber ja zu Text umgewandelt und mit den Default-Werten in das andere Dokument eingefügt. Jetzt habe ich gesehen, dass das Range-Objekt ja auch ein XML-Attribut hat.

Wäre es evtl. möglich über die XML-Daten an die Felder zu kommen? Wenn ja, wie könnte ich die verarbeiten?

G
GrafWasserrutsche Themenstarter:in
20 Beiträge seit 2013
vor 10 Jahren

So, war ganz einfach, für die, die es interessiert:

wordApp.Selection.InsertXML(rngTarget.WordOpenXML);

Damit wird dann auch wirklich alles übernommen.