Word İşlemleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Word İşlemleri

Mesaj gönderen emrah24 »

Merhaba arkadaşlar Delphi konusunda çok fazla tecrüben yok. Kendimi geliştirmeye çalışıyorum. Bir konuda yardıma ihtiyacım var.
Şimdi aşağıdaki kodlarla worda aktarım sağlıyorum. Ancak bilgisayarda ya word yada open office yüklü.
Microsoft yüklü ise sorun yok ancak Open Office yüklü olan Pc'lerde Çalışmıyor.
Bu konuda yardımcı olursanız çok sevinirim :)

KOD YAPISI ŞÖYLE :

Kod: Tümünü seç

uses
  ComObj;

// Replace Flags
type
  TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);

function Word_StringReplace(ADocument: TFileName; SearchString, ReplaceString: string; Flags: TWordReplaceFlags): Boolean;
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var
  WordApp: OLEVariant;
begin
  Result := False;

  { Check if file exists }
  if not FileExists(ADocument) then
  begin
    ShowMessage('Specified Document not found.');
    Exit;
  end;

  { Create the OLE Object }
  try
    WordApp := CreateOLEObject('Word.Application');
  except
    on E: Exception do
    begin
      E.Message := 'Word is not available.';
      raise;
    end;
  end;

  try
    { Hide Word }
    WordApp.Visible := False;
    { Open the document }
    WordApp.Documents.Open(ADocument);
    { Initialize parameters}
    WordApp.Selection.Find.ClearFormatting;
    WordApp.Selection.Find.Text := SearchString;
    WordApp.Selection.Find.Replacement.Text := ReplaceString;
    WordApp.Selection.Find.Forward := True;
    WordApp.Selection.Find.Wrap := wdFindContinue;
    WordApp.Selection.Find.Format := False;
    WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;
    WordApp.Selection.Find.MatchWholeWord := False;
    WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
    WordApp.Selection.Find.MatchSoundsLike := False;
    WordApp.Selection.Find.MatchAllWordForms := False;
    { Perform the search}
    if wrfReplaceAll in Flags then
      WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
    else
      WordApp.Selection.Find.Execute(Replace := wdReplaceOne);
    { Save word }
    WordApp.ActiveDocument.SaveAs(ADocument);
    { Assume that successful }
    Result := True;
    { Close the document }
    WordApp.ActiveDocument.Close(wdDoNotSaveChanges);
  finally
    { Quit Word }
    WordApp.Quit;
    WordApp := Unassigned;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Word_StringReplace('C:\Test.doc','Old String','New String',[wrfReplaceAll]);
end;
En son emrah24 tarafından 03 Eyl 2018 12:34 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: WORD İŞLEMİ

Mesaj gönderen mkysoft »

Kodlarınızda zaten WordApp kullanacağınızı belirtmişsiniz. Open Office ile Microsoft Office birbirinden tamamen bağımsız ve farklı ürünlerdir. Open Office'in com desteği var mı bilmiyorum, eğer varsa onun için ayrıca kod yazmanız gerekir. Office'e bağımlı kalmadan word belgeleri üretebilen native uygulamalara bakabilirsiniz.
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Re: WORD İŞLEMİ

Mesaj gönderen emrah24 »

mkysoft Teşekkür ederim.

Office'e bağımlı kalmadan word belgeleri üretebilen native uygulamalara bakabilirsiniz.

nasıl arama yapmam gerekiyor sonuca erişebilmek adına.

Aslında yapmak istediğim işlem için farkı bir yol var mı onu bilmiyorum.
hazır bir word belgesinde OLE kullanmadan find and replace yapmam lazım :(
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: WORD İŞLEMİ

Mesaj gönderen freeman35 »

-Mesaj başlığında ufak harf kullan
-Mesaj içeriğinde tag ları kullan ki daha okunur ve anlaması kolay olsun
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Re: WORD İŞLEMİ

Mesaj gönderen emrah24 »

freeman35 yazdı: 03 Eyl 2018 11:04 -Mesaj başlığında ufak harf kullan
-Mesaj içeriğinde tag ları kullan ki daha okunur ve anlaması kolay olsun
Teşekkürler
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Word İşlemleri

Mesaj gönderen mkysoft »

"delphi native docx reader writer" şeklinde arama yapabilirsiniz.
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Re: Word İşlemleri

Mesaj gönderen emrah24 »

yapamadım. ancak farklı bir yol buldum. Burda da başka sıkıntı var. Prosudür var ama bunda da birden fazla değişiklik olmuyor.
sadece ilk gelen değişikliği yapıyor sonra her işlem için ayrı ayrı dosya açıyor.

Çözemedim bir türlü yardımcı olursanız sevinirim.

Kod: Tümünü seç

procedure OpenOfficeReplace(const AFileURL: string; ASearch: string; const AReplace: string);
var
  StarOffice: Variant;
  StarDesktop: Variant;
  StarDocument: Variant;
  FileReplace: Variant;
  FileParams: Variant;
  FileProperty: Variant;

begin

  StarOffice := CreateOleObject('com.sun.star.ServiceManager');
  StarDesktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop');

  FileParams := VarArrayCreate([0, 0], varVariant);
  FileProperty := StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
  FileProperty.Name := 'Hidden';
  FileProperty.Value := False;
  FileParams[0] := FileProperty;

  StarDocument := StarDesktop.LoadComponentFromURL(AFileURL, '_blank', 0, FileParams);

  FileReplace := StarDocument.CreateReplaceDescriptor;
  FileReplace.SearchCaseSensitive := False;
  FileReplace.SetSearchString(ASearch);
  FileReplace.SetReplaceString(AReplace);

  StarDocument.ReplaceAll(FileReplace);

  //ShowMessage('Replace has been finished');

 StarDocument.Close(True);
 StarDesktop.Terminate;
 StarOffice := Unassigned;

         end;

Kullanımım Şöyle

Kod: Tümünü seç

OpenOfficeReplace(Pchar(yoltemiz),'[adres]',Pchar(adres));
OpenOfficeReplace(Pchar(yoltemiz),'[telefon]',Pchar(adres));
OpenOfficeReplace(Pchar(yoltemiz),'[ililce]',Pchar(ililce));
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Re: Word İşlemleri

Mesaj gönderen emrah24 »

okuyan arkadaş olursa buradaki hatayı buldum. procedure dosyadaki metni değiştirip açıyor. Yani Kaydetmeden açıyor. Bir Sonrakine geçince salt okunur açıyor.

Şuan tek istediğim bu procedure de word deki gibi visible çalışması ve kaydetmesi lazım ki bir sonraki replace işini düzgün yapsın
StarDocument.StoreAsURL('file:///D:/test.doc', FileParams);
vd deniyorum hep hata veriyor
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Re: Word İşlemleri

Mesaj gönderen emrah24 »

mkysoft yazdı: 03 Eyl 2018 01:46 "delphi native docx reader writer" şeklinde arama yapabilirsiniz.
Hocam kaç gündür uğraşıyorum çözemedim ben bu işi :(

kesinlikle microsoft/openoffice olmadan bu belgerde replace yapmam lazım.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Word İşlemleri

Mesaj gönderen mkysoft »

Delphi tarafında bir tecrübem bulunmuyor, C# tarafında kütüphaneler kullanmayı denemiş stabil bir çözüm bulamayınca sunucuya office lisansı satın almıştık.
emrah24
Üye
Mesajlar: 21
Kayıt: 02 Eyl 2018 05:36

Re: Word İşlemleri

Mesaj gönderen emrah24 »

mkysoft yazdı: 07 Eyl 2018 05:35 Delphi tarafında bir tecrübem bulunmuyor, C# tarafında kütüphaneler kullanmayı denemiş stabil bir çözüm bulamayınca sunucuya office lisansı satın almıştık.
teşekkürler ilginize
Cevapla