Einzelnen Beitrag anzeigen

JoelH
(Gast)

n/a Beiträge
 
#7

hmm,

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