Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Word-Dokument seitenweise splitten (https://www.delphipraxis.net/101822-word-dokument-seitenweise-splitten.html)

DeddyH 18. Okt 2007 17:24


Word-Dokument seitenweise splitten
 
Hallo DPler,

ich möchte ein existierendes Word-Dokument seitenweise in Einzeldokumenten ablegen. Leider habe ich mich noch nie mit OLE-Automation beschäftigt und weiß daher nicht, wie ich da nun genau vorgehen muss. Gibt es evtl. eine Möglichkeit, ganz auf OLE zu verzichten, das Dokument z.B. in einen Stream zu laden, nach einer Art "Seitenkennung" zu suchen und dann zu speichern, oder ist OLE die praktikablere Möglichkeit? Hier mal mein bisheriger Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Word: Variant;
    Seiten, i: integer;
begin
  try
    Word := GetActiveOleObject('Word.Application');
  except
    Word := CreateOleObject('Word.Application');
  end;
  Word.Visible := True;
  Word.Documents.Open('C:\Dok1.doc',
                      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                      EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  Seiten := Word.ActiveDocument.ComputeStatistics(2);
  for i := 0 to Seiten - 1 do
    begin
      //aktuelle Seite markieren und als Dokument abspeichern
    end;
  Word.ActiveDocument.Close( -1, EmptyParam, EmptyParam);
end;

shmia 18. Okt 2007 17:37

Re: Word-Dokument seitenweise splitten
 
Zitat:

Zitat von DeddyH
Gibt es evtl. eine Möglichkeit, ganz auf OLE zu verzichten, das Dokument z.B. in einen Stream zu laden, nach einer Art "Seitenkennung" zu suchen und dann zu speichern, oder ist OLE die praktikablere Möglichkeit?

Nein, die Daten müssen ja von Word gerendert werden, damit man die Seitenumbrüche findet.
Das Wordformat ist für aussenstehende Programme nahezu unlesbar.
Allerdings kommst du wahrscheinlich mit VB Script innerhalb von Word oder einem Makro am schnellsten zum Ziel.
Hier mal ein Makro, dass einen Seitenumbruch findet:
Code:
Sub Makro1()
'
' Makro1 Makro
' Makro aufgezeichnet am 18.10.2007 von shmia
'
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "^m"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute ' suchen
    Selection.Find.Execute ' nochmal suchen
    Selection.Find.Execute
End Sub

DeddyH 18. Okt 2007 17:53

Re: Word-Dokument seitenweise splitten
 
Hallo shmia, Danke für Deine Antwort. Geht das auch von "außen", d.h. aus Delphi heraus? Der Hintergrund ist der:
Einer unserer Kunden benutzt eine Finanzsoftware, die bei einem z.B. Mahnlauf sämtliche Anschreiben in einem großen Dokument ablegt. Somit ist es für die Sachbearbeiterin sehr mühsam, das Dokument so zu bearbeiten (händisch zu splitten), dass sie die einzelnen Schreiben den entsprechenden Debitoren zuordnen kann. Da erfahrungsgemäß die Anschreiben eine Seite nicht überschreiten, war meine Idee eben, diese Splittung auf Einzeldokumente zu automatisieren. Ob der Kunde allerdings damit einverstanden ist, Makros von mir zu akzeptieren, wage ich zu bezweifeln.

BTW: Das gehört zum Kundendienst, falls ich das hinbekomme, nicht, dass jemand meint, ich will mich auf Kosten der Community bereichern ;)

Progman 18. Okt 2007 18:37

Re: Word-Dokument seitenweise splitten
 
Hier ein Codefragment (damals noch Delphi 6).
Es wurde ein Worddocument mit Word geöffnet und als RTF gespeichert.
Auf dem Form liegen:
Delphi-Quellcode:
    Word_App: TWordApplication;
    Word_Doc: TWordDocument;

//die eigentliche Routine
    try
      Word_App.Connect;
    except
      ShowMessage('MS-Word scheint nicht installiert zu sein!');
      Exit;
    end;
//    Word_App.Visible:=True;
    try
      Word_App.Documents.OpenOld(wDocFileOpenName,EmptyParam,EmptyParam,wdAddToRecent,
                    EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
      Pause:=True;
      Word_App.ActiveDocument.SaveAs(wRTFTempName,wdFormatRTF,EmptyParam,EmptyParam,
        wdAddToRecent,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
    finally
      Word_App.ActiveDocument.Close(wdSaveChanges,EmptyParam,EmptyParam);
      Word_App.Quit(wdSaveChanges);
      Word_App.Disconnect;
    end;
Vielleicht hilfts dir was, man müsste mal die ganzem Parameter erforschen.
Ich könnte mir vorstellen, dass es möglich ist, was du vorhast.

DeddyH 18. Okt 2007 19:05

Re: Word-Dokument seitenweise splitten
 
Auch Dir Danke. Ich habe mittlerweile einen VBA-Code gefunden, der meinem Vorhaben halbwegs nahe kommt. Leider lässt sich das so nicht 1:1 in Delphi umsetzen, aber ich bleibe dran ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz