Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OpenOffice und OLE, wie ? (https://www.delphipraxis.net/6812-openoffice-und-ole-wie.html)

JoelH 23. Jul 2003 12:44


OpenOffice und OLE, wie ?
 
ich hab folgendes probiert, häng jetzt aber an einer Access Violation und komm einfach nicht damit klar, weil mir nicht klar ist was falsch ist :(

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var oV_Word, stardesktop, Doc, x : OleVariant;
    feldname, feldinhalt, datei : String;
begin
  feldname := 'zuersetzen';
  feldinhalt := 'neuer Inhalt';
  datei := 'file:///C:/test.sxw';
  try
    oV_Word := CreateOleObject('com.sun.star.ServiceManager');
    StarDesktop := ov_word.createInstance('com.sun.star.frame.desktop');
    Doc := StarDesktop.LoadComponentFromurl(datei,'_blank',0,x);

  except
    showmessage('Geht noch nicht so richtig !');
  end;
end;
ich bin nicht sicher ob der Pfad so richtig angegeben ist . Der Fehler kommt bei der Belegung von Doc, das mag er nicht, vielleicht bzw. wahrscheinlich sind einfach die Parameter falsch aber ich blick momentan nicht welcher der ganzen :(

als vorlage diente mir dies

http://mail.python.org/pipermail/pyt...ay/000359.html

Phoenix 23. Jul 2003 15:19

Re: OpenOffice und OLE, wie ?
 
Probier's mal mit

Delphi-Quellcode:
Doc := StarDesktop.LoadComponentFromurl(datei,'_blank',0,nil);
Du hast das x als nicht initialisierte Variable übergeben, und dann
noch vom Typ OleVariant. Ich weiss nicht, ob er dieses Argument in der Weise verträgt. Wenn Du explizit nichts übergibst dürfte er wenigstens nicht drüber stolpern.

JoelH 23. Jul 2003 17:30

hmm,
 
joo, jetzt wo du es sagst, die OleVariant sind eigentlich völliger Unsinn, sollten normale Variants sein.

JoelH 25. Jul 2003 10:12

Re: OpenOffice und OLE, wie ?
 
OßpenOffice ist einfach klasse, frisst die alten Wordvorlagen und ersetzt die Bookmarks viel schneller als Word selbst :) Warum etwas für hunderte von Euro kaufen wenn es mit OpenSource viel schneller geht und dazu noch kostenlos ist !?

PS: Habt ihr schon die tolle Anzeige von Word gesehen =>

1223 Zeichen. ( ein ungefährer Wert)


:D :D Was nun 1223 Zeichen oder nicht ? :D :D

lorrey 30. Jul 2003 09:48

Re: OpenOffice und OLE, wie ?
 
Hi JoelH !

Ich wäre Dir echt dankbar wenn du noch mal das Coding um eine Bookmark in OpenOffice zu ersetzen posten könntest!

Ich bekomme bei mir immer noch ne AccessViolation :cry:

Thx!

JoelH 30. Jul 2003 21:19

hmm,
 
joo, ich hab die Klasse noch ein wenig erweitert, ich poste sie morgen nochmal hab den Kram auf der Arbeit und da bin ich schon raus :)

meinst du bei diesem Posting ?
=> http://www.delphipraxis.net/viewtopic.php?t=7726

Welche OO Version benutzt du denn ? Ich hab es nur mit 1.1rc getestet. Kompiliert mit D4 , ich denke mit höher muss man noch Variant einbinden aber dass ist dir sicher schon aufgefallen.

JoelH 31. Jul 2003 08:14

hmm,
 
so , hier mein neuer Code :
Delphi-Quellcode:
unit OO_Handling;

// Eine kleine Klasse zum einfachsten Handling von OpenOffice Dokumenten
// Sollte noch um viele Funktionen erweiterbar sein
// hab mal erst nur die Wichtigsten eingebaut
// Diese Funktionen funktionieren auch mit Word .dot Files,
// Das ersetzen geht sogar mit OpenOffice schneller als mit Word selbst.

interface
uses Windows, SysUtils, comobj, Classes;

type TOLE_OpenOffice = class(TObject)

private
  p_Doc_Type : String;
  // Da OpenOffice Pfadangaben im Unixstyle haben will werden Backslashes umgewandelt
  function ToOOPfad(Pfad:String):String;
  procedure Setze_Doc_Type(s:string);
protected
  // Das OLE-Objekt, die Desktopinstanz und das Dokument selbst.
  Service, Desktop, Document : Variant;
public
  // Erstellt ein OLE Objekt;
  function Connect: boolean;
  // Oeffnet eine neues Dokument
  function Open:boolean;OVERLOAD;
  // Laden eines vorhandenen Dokuments
  function Open(datei:string):boolean;OVERLOAD;
  // Ein Bookmarkfeld ersetzen ( Nicht Case Sensitiv)
  function ErsetzeBookmark(name,inhalt:String):boolean;
  // Liste von allen Bookmarks als Stringlist;
  function HoleBookmarks:TStringlist;
  function HoleZellinhalt(sheet,zelle:String):String;OVERLOAD;
  function HoleZellinhalt(sheet:string;xpos,ypos:integer):String;OVERLOAD;
  function SchreibeZellinhalt(sheet,zelle,inhalt:String):boolean;OVERLOAD;
  function SchreibeZellinhalt(sheet:string;xpos,ypos:integer;inhalt:String):boolean;OVERLOAD;
 
  //  Destruktor
  destructor Destroy;OVERRIDE;
  property Doc_Type:String read p_Doc_Type write Setze_Doc_Type;
end;

implementation

destructor TOLE_OpenOffice.Destroy;
begin
  Service := Unassigned;
  inherited Destroy;
end;

function TOLE_OpenOffice.Connect:boolean;
var rueckgabe : boolean;
begin
    try
      Service := CreateOleObject('com.sun.star.ServiceManager');
      Desktop := Service.createInstance('com.sun.star.frame.Desktop');
      rueckgabe := true;
    except
      rueckgabe := false;
    end;
    result := rueckgabe;
end;

function TOLE_OpenOffice.Open:boolean;
var rueckgabe : boolean;
begin
  try
    Document := Desktop.LoadComponentFromURL(
              'private:factory/swriter',
              '_blank',
              0,
              VarArrayCreate([0, - 1], varVariant));
    rueckgabe := true;
    setze_Doc_Type('dummy');
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;

procedure TOLE_OpenOffice.Setze_Doc_Type(s:string);
var rueckgabe:String;
begin
  rueckgabe := '';
  if (Document.SupportsService('com.sun.star.sheet.SpreadsheetDocument')) then
    rueckgabe := 'scalc';
  if (Document.SupportsService('com.sun.star.text.TextDocument')) then
    rueckgabe := 'swriter';
  if (Document.SupportsService('com.sun.star.drawing.DrawingDocument')) then
    rueckgabe := 'sdraw';
  if (Document.SupportsService('com.sun.star.formula.FormulaProperties')) then
    rueckgabe := 'smath';
  if (rueckgabe = '') then
    rueckgabe := 'unknown';
  p_Doc_Type:= rueckgabe;
 // result:= rueckgabe;
end;


function TOLE_OpenOffice.Open(datei:string):boolean;
var rueckgabe : boolean;
begin
  datei := ToOOPfad(datei);
  try
    Document := Desktop.LoadComponentFromURL(
              datei,
              '_blank',
              0,
              VarArrayCreate([0, - 1], varVariant));
    rueckgabe := true;
    setze_Doc_Type('dummy');
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;

function TOLE_OpenOffice.ToOOPfad(Pfad:String):String;
var rueckgabe : string;
    i : integer;
begin
  rueckgabe := 'file:///';
  while (POS('\',pfad)>0) do
  begin
    i := POS('\',pfad);
    delete(pfad,i,1);
    Insert('/',pfad,i);
  end;
  rueckgabe := rueckgabe + pfad;
  result := rueckgabe;
end;

function TOLE_OpenOffice.ErsetzeBookmark(name,inhalt:String):boolean;
var objtext, tc, bm, li : Variant;
    i : integer;
    rueckgabe : boolean;
begin
  rueckgabe := false;
  try
    objText := Document.getText;
    tc := objText.createTextcursor;
    li := Document.Bookmarks.getElementNames;
    for i := VarArrayLowBound(li,1) to VarArrayHighBound(li,1) do
    begin
      if (uppercase(li[i]) = uppercase(name)) then
      begin
        bm := Document.Bookmarks.getbyName(li[i]);
        tc := Document.Text.createTextCursorByRange(bm.Anchor);
        tc.string := inhalt;
        rueckgabe := true;
      end;
    end;
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;

function TOLE_OpenOffice.HoleBookmarks:TStringlist;
var liste : TStringlist;
    i : integer;
    li : Variant;
begin
  liste := TStringlist.create;
  liste.Clear;
  li := Document.Bookmarks.getElementNames;
  for i := VarArrayLowBound(li,1) to VarArrayHighBound(li,1) do
  begin
    liste.add(li[i]);
  end;
  result := liste;
end;

function TOLE_OpenOffice.HoleZellinhalt(sheet,zelle:String):String;
var sh,bm : Variant;
begin
  sh := Document.Sheets.getByName(sheet);
  bm := sh.getCellRangebyName(zelle);
  result := bm.getString;
end;

function TOLE_OpenOffice.HoleZellinhalt(sheet:String;xpos,ypos:integer):String;
var sh,bm : Variant;
begin
  sh := Document.Sheets.getByName(sheet);
  bm := sh.getCellbyPosition(xpos,ypos);
  result := bm.getString;
end;

function TOLE_OpenOffice.SchreibeZellinhalt(sheet,zelle,inhalt:String):boolean;
var sh,bm,tc : Variant;
begin
  sh := Document.Sheets.getByName(sheet);
  bm := sh.getCellRangebyName(zelle);
  bm.setString(inhalt);
end;

function TOLE_OpenOffice.SchreibeZellinhalt(sheet:String;xpos,ypos:integer;inhalt:String):boolean;
var sh,bm,tc : Variant;
begin
  sh := Document.Sheets.getByName(sheet);
  bm := sh.getCellbyPosition(xpos,ypos);
  bm.setString(inhalt);
end;

end.
zu beachten ist dass man den Doc Type noch selbst abfragen muss und sichern muss dass man nicht in Writerdocs auf Zellen zugreifen will sondern auf Bookmarks und in Calcsheets umgekehrt agiert.

To be continued....

lorrey 31. Jul 2003 08:39

Re: OpenOffice und OLE, wie ?
 
Hey Joel!

Danke für das Coding, hatte es mittlerweile schon selbst rausgefunden...aber du hast natürlich noch ein paar nette Sachen drin, die ich noch nicht wusste!

Was ich aber unbedingt noch bräuchte, wären so grundlegende Sachen, wie Dokument speichern oder schliessen !

Hast du einen Plan wie man so was macht?!?
Btw, gibt es mittlerweile mal ne vernünftige Doku wo die ganze API mit allen Funktionen beschrieben ist?!?

Nachmals Danke für dein Coding!

Ach so ich hab auch die 1.1 OO Version.

JoelH 31. Jul 2003 08:45

Re: OpenOffice und OLE, wie ?
 
ich hab bisher nur das gefunden
http://api.openoffice.org/common/ref...module-ix.html
ist nichts tolles aber immerhin ist glaub ich alles drin was es so gibt.

lorrey 31. Jul 2003 09:18

Re: OpenOffice und OLE, wie ?
 
jo auf die seite bin ich auch schon gestossen, aber ich finde da einfach nichts, wie ich so dummes dokument speichern und schliessen kann ! (vielleicht bin ich auch zu blind... ) :wink:

ich will nämlich das ganze nur im hintergrund machen - sprich vorlage x auf machen - bookmarks mit werten aus db ersetzen - dokument speichern - drucken - und schliessen!

und das halt so das es der benutzer nicht merkt :wink:

wie drucken geht, weiss ich schon, aber speichern und schliessen - kein plan :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 Uhr.
Seite 1 von 3  1 23      

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