Laden...

Word Dokumente zusammenfassen

Letzter Beitrag vor 11 Monaten 10 Posts 651 Views
Word Dokumente zusammenfassen

Hallo Community,

folgende Aufgabenstellung habe ich. Ich soll aus mehreren Word Dokumenten jeweils ein paar Seiten heraus kopieren und in ein großes Word Dokument zusammenfassen. Soweit so unspektakulär. Allerdings hab ich aktuell noch nie mit Word in C# gearbeitet und bin erstmal komplett am verzweifeln.

Mein jetziger Stand ist so. Ziel Dokument wird geöffnet. Quell Dokument wird geöffnet und die entsprechende Seite wird auch heraus kopiert und in das neue Dokument eingefügt. Ebenso wird das zweite Dokument geöffnet und dann in die Ziel Datei eingefügt. Aber hier kommt das Problem. Der neue Teil überschreibt den alten Teil anstatt ihn anzuhängen. Ich komme nicht mehr weiter und brauche eure Schwarmintelligenz. Hier mein Code:

            object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */            
            object oMissing = Missing.Value;
            object Start;
            object Ende;

            //Start Word and create a new document.
            Word.Application ZielApplikation = new Word.Application();
            ZielApplikation = new Word.Application
            {
                Visible = true
            };
            Document ZielDokument = ZielApplikation.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);


            Word.Application QuellApplikation = new Word.Application();

            // Pfad zum ursprünglichen Word-Dokument
            string originalFilePath = @"D:\Anzeige1.docx";

            Document QuellDokument = QuellApplikation.Documents.Open(originalFilePath);

            Start = QuellDokument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, 2).Start;
            Ende = QuellDokument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, 3).Start;

            Range pageRange = QuellDokument.Range(Start, Ende);
            pageRange.Copy();
            ZielDokument.Content.Paste();

            QuellDokument.Close();

            object pagebreak = Word.WdBreakType.wdPageBreak;

            ZielApplikation.Selection.InsertBreak(ref pagebreak);
            ZielDokument.GoTo(WdGoToItem.wdGoToEndnote);

            originalFilePath = @"D:\Anzeige2.docx";
            QuellDokument = QuellApplikation.Documents.Open(originalFilePath);

            Start = QuellDokument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, 2).Start;
            Ende = QuellDokument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, 3).Start;

         
            pageRange = QuellDokument.Range(Start, Ende);
            pageRange.Copy();
          
            ZielDokument.Content.Paste();

            QuellDokument.Close();

            QuellApplikation.Quit();
            

Hallo und willkommen,

mit Content.Paste() wird das gesamte Dokument ersetzt. Ähnlich wie beim Öffnen mußt du einen Range definieren, in den dann die Daten eingefügt werden, s.a. Programmgesteuertes Definieren und Auswählen von Bereichen in Dokumenten sowie Programmgesteuertes Suchen und Ersetzen von Text in Dokumenten.

Probiere mal

Range range = ZielDokument.Range(ZielDokument.Content.End, ZielDokument.Content.End);
range.Paste();

PS: Du solltest das Zieldokument auch noch abspeichern.

Danke für die Antwort.

Hab das jetzt mal im Code so implementiert. Leider bekomme ich jetzt jedes Mal die Meldung:

System.Runtime.InteropServices.COMException: "Aufruf wurde durch Aufgerufenen abgelehnt. (Ausnahme von HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))"

Leider finde ich keine sinnvolle Antwort zu dieser Fehlermeldung. Die Meldung hab ich schon ein paar Mal gehabt auch bisher schon. Aber bisher hab ich diese Meldung immer nur beim zweiten Anlauf gehabt wenn der erste Schief ging und hab es entsprechend auf nicht sauber geschlossen zurück geführt. Ein "Abschießen" aller Word Instanzen hatte dann dazu geführt dass es zumindest wieder weiter ging. Das hilft leider hier nicht.

Du hast ja eine docx Datei; hat das einen Grund wieso Du mit Interop statt mit OpenXML arbeitest? Interop ist der sehr sehr sehr sehr alte Weg, um mit Office Daten über Office-Applikationsinstanzen zu arbeiten; OpenXML braucht das alles nicht mehr.

Bei OpenXML verwendest Du für das Mergen einfach AltChunk.

Der einzige Grund ist dass ich es nicht besser weiß 😄

Ich hatte bisher noch nie Kontakt mit Word in Kombination mit C#. Leider findet man auch im Internet nicht wirklich sinnvolle Informationen dazu. Das was ich da bisher an Code zusammengeschustert habe war auch mehr Try and Error als Wissen. Entsprechend bin ich über jeden Input froh.

Auf OpenXML wirst eigentlich direkt in den Microsoft Docs verwiesen, da alle Interop-Dokumentationen (außer die Klasse selbst) im Archiv liegen.
Getting started with the Open XML SDK

Das ist der aktuelle Stand der Technik, um mit OpenXML-Dateien (wie docx) umzugehen.

Der Interop-Support ist seit Jahren abgekündigt und funktioniert auch nicht mehr mit den neuesten Office-Versionen, da ja die Runtime auf WebView2 gewechselt wurde.

Wenn dir OpenXML zu sperrig ist kannst du es auch mit ClosedXml versuchen. Das arbeitet im Hintergrund mit OpenXml, hat aber den Anspruch etwas freundlicher im Umgang zu sein.

Hat die Blume einen Knick, war der Schmetterling zu dick.

Naja wenn es ganz nach mir ginge würd Word einfach komplett raus fliegen und die Dokumente würden mit Latex geschrieben. Dann wäre das alles gar kein Problem mehr. Ich werde mir die genannten Sachen alle mal anschauen.

Danke schonmal an alle!

LaTex Doc Automation ist aber eine riesige Frickelei von String-Kombinationen. Ohne entsprechendes Paket - gibt nen paar auf GitHub - ist das auch purer Schmerz. Hinzu kommt, dass das alles super umständlich bis gar nicht validiert werden kann - mit OpenXML hat man wenigstens die Validierungssicherheit und es gibt nen fertiges SDK.