![]() |
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:
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 :(
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; als vorlage diente mir dies ![]() |
Re: OpenOffice und OLE, wie ?
Probier's mal mit
Delphi-Quellcode:
Du hast das x als nicht initialisierte Variable übergeben, und dann
Doc := StarDesktop.LoadComponentFromurl(datei,'_blank',0,nil);
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. |
hmm,
joo, jetzt wo du es sagst, die OleVariant sind eigentlich völliger Unsinn, sollten normale Variants sein.
|
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 |
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! |
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 ? => ![]() 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. |
hmm,
so , hier mein neuer Code :
Delphi-Quellcode:
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.
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. To be continued.... |
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. |
Re: OpenOffice und OLE, wie ?
ich hab bisher nur das gefunden
![]() ist nichts tolles aber immerhin ist glaub ich alles drin was es so gibt. |
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 08:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz