AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OpenOffice und OLE, wie ?

Offene Frage von "thaman"
Ein Thema von JoelH · begonnen am 23. Jul 2003 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
Seite 1 von 3  1 23   
JoelH
(Gast)

n/a Beiträge
 
#1

OpenOffice und OLE, wie ?

  Alt 23. Jul 2003, 12:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#2

Re: OpenOffice und OLE, wie ?

  Alt 23. Jul 2003, 15:19
Probier's mal mit

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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#3

hmm,

  Alt 23. Jul 2003, 17:30
joo, jetzt wo du es sagst, die OleVariant sind eigentlich völliger Unsinn, sollten normale Variants sein.
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#4

Re: OpenOffice und OLE, wie ?

  Alt 25. Jul 2003, 10:12
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)


Was nun 1223 Zeichen oder nicht ?
  Mit Zitat antworten Zitat
lorrey

Registriert seit: 29. Jul 2003
42 Beiträge
 
Delphi 7 Professional
 
#5

Re: OpenOffice und OLE, wie ?

  Alt 30. Jul 2003, 09:48
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

Thx!
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#6

hmm,

  Alt 30. Jul 2003, 21:19
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.
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#7

hmm,

  Alt 31. Jul 2003, 08:14
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....
  Mit Zitat antworten Zitat
lorrey

Registriert seit: 29. Jul 2003
42 Beiträge
 
Delphi 7 Professional
 
#8

Re: OpenOffice und OLE, wie ?

  Alt 31. Jul 2003, 08:39
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.
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#9

Re: OpenOffice und OLE, wie ?

  Alt 31. Jul 2003, 08:45
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.
  Mit Zitat antworten Zitat
lorrey

Registriert seit: 29. Jul 2003
42 Beiträge
 
Delphi 7 Professional
 
#10

Re: OpenOffice und OLE, wie ?

  Alt 31. Jul 2003, 09:18
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... )

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

wie drucken geht, weiss ich schon, aber speichern und schliessen - kein plan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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