Search code examples
delphiopenoffice.orgreplacedocxodt

How to Search and Replace in odt Open Office document?


In my Delphi application I am currently do Search&Replace programmatically for doc and docx word documents using office ole automation. Does anyone has the code to do the same (for doc, docs, odt) in OpenOffice?

I also asked a related question on saving to pdf.


Solution

  • You should take a focus on XReplaceable interface. Here is the example. Please note, that there's no error handling. I've tested it with LibreOffice writer and it works fine for me.

    uses
      ComObj;
    
    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;
    

    And the usage of the example

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      OpenOfficeReplace('file:///C:/File.odt', 'Search', 'Replace');
    end;
    

    There are also several search/replace options for SearchDescriptor.