AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Dateieigenschaften /Titel, Thema,...) von Office 2007ff lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Dateieigenschaften /Titel, Thema,...) von Office 2007ff lesen

Ein Thema von norwegen60 · begonnen am 14. Sep 2014 · letzter Beitrag vom 30. Okt 2014
 
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
522 Beiträge
 
Delphi 12 Athens
 
#1

Dateieigenschaften /Titel, Thema,...) von Office 2007ff lesen

  Alt 14. Sep 2014, 14:44
Hallo zusammen,

ich habe bisher problemlos die Dateieigenschaften (Titel, Thema, Autor, ...) von Office-Dateien mit DsoFile.dll ausgelesen. Die DLL hatte folgende Vorteile:
  • Ein Aufruf egal um welche Office-Anwendung es sich handelte
  • Es ging verhältnismäßig schnell
  • Office brauchte nicht installiert zu sein
  • Es hat auch bei passwortgeschützten Dateien funktioniert
  • Es hat auch unter Win7-64bit funktioniert wenn die DLL korrekt registriert war
Es hat aber nicht mit Dokumenten funktioniert, die im Office 2007- und späteren Format abgelegt wurden.

Nach längerem, erfolglosen Suchen nach einer besseren Möglichkeit lese ich jetzt docx, dotx und Co über OLE-Automation, d.h. je nach Dokument über TWordapplication, TExcelApplication, TPowerpointapplication ein.

Der Code
Delphi-Quellcode:
type
  TProp = record
    bLoad : Boolean;
    FTitel : String;
    FThema : String;
    FAutor : String;
    FGroesse : Int64;
    FAendDat : TDateTime;
    bAttachment : Boolean;
    iAttachment : Integer;
    Body : String;
    Header : String;
  end;
...

function TuProp.GetDocumentPropertiesXML(sFile: WideString): TProp;
Var
  waWord : TWordApplication;
  eaExcel : TExcelApplication;
  paPowerPoint : TPowerpointApplication;

  VarBool,
  VarName,
  VarVar : OleVariant;
  i : integer;
  sExt : String;
  iTyp : Byte;
  iID : Integer;

begin
  VarName := sFile;
  sExt:= Lowercase(Sysutils.ExtractFileExt(VarName));
  if (pos('.docx', sExt) = 1) or (pos('.dotx', sExt) = 1) then
    iTyp := 1
  else if (pos('.xlsx', sExt) = 1) or (pos('.xltx', sExt) = 1) then
    iTyp := 2
  else if (pos('.pptx', sExt) = 1) or (pos('.ppsx', sExt) = 1) then
    iTyp := 3;

  Result.bLoad := false;
  try
    case iTyp of
     1: begin
          waWord := TWordApplication.Create(nil);
          waWord.Connect;
          waWord.Documents.OpenOld(VarNAme,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
          // Vorgegebene Properties lesen
          VarVar := waWord.ActiveDocument.BuiltInDocumentProperties;
        end;
     2: begin
          eaExcel := TExcelApplication.Create(nil);
          eaExcel.Connect;
          eaExcel.Workbooks.Open(VarNAme,
            EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,
            iID);
          // Vorgegebene Properties lesen
          VarVar := eaExcel.ActiveWorkBook.BuiltInDocumentProperties;
        end;
     3: begin
          paPowerpoint := TPowerpointApplication.Create(nil);
          paPowerpoint.Connect;
          paPowerpoint.Presentations.OpenOld(VarNAme,EmptyParam,EmptyParam,EmptyParam);
          // Vorgegebene Properties lesen
          VarVar := paPowerpoint.ActivePresentation.BuiltInDocumentProperties;
        end;
    end;

    Result.FTitel := VarVar.Item[wdPropertyTitle];
    Result.FThema := VarVar.Item[wdPropertySubject];
    Result.FAutor :=VarVar.Item[wdPropertyAuthor];
    Result.bLoad := true;
  finally
    VarBool := False;
    case iTyp of
     1: begin
          waWord.ActiveDocument.Close(VarBool,EmptyParam,EmptyParam);
          waWord.Quit;
          waWord.Disconnect;
          waWord.Free;
        end;
     2: begin
          eaExcel.ActiveWorkBook.Close(VarBool,EmptyParam,EmptyParam, iID);
          eaExcel.Quit;
          eaExcel.Disconnect;
          eaExcel.Free;
        end;
     3: begin
          paPowerpoint.ActivePresentation.Close;
          paPowerpoint.Quit;
          paPowerpoint.Disconnect;
          paPowerpoint.Free;
        end;
    end;
  end;
end;
Das funktioniert zwar und lässt sicher auch noch ein etwas besseres Fehlerhandling zu, hat aber trotzdem folgende Nachteile:
  • Auf dem PC muss eine Office-Version installiert sein
  • Wenn Office 2003 installiert ist, kommt bei einem Teil der docx-Dateien, die Meldung, dass Datei in kompatibles Format gebracht wird
  • Bei passwortgeschützten Dokumenten kommt Aufforderung zur Eingabe des Passworts
  • Es dauert länger als mit der DsoFile.dll
Auch der Win7-Explorer selbst scheint Probleme mit dem Passwort zu haben, denn auch dort werden, wenn man in der Dateiliste z.B. Titel hinzufügt, dieser nur bei alten (auch passwortgeschützten) .doc angezeigt, nicht aber bei .docx.

Hat jemand einen anderen, brauchbareren Weg um die Dateieigenschaften von Office2007 und später auszulesen?

Die in verschiedenen Foren erwähnte Lösung http://www.entwickler-ecke.de/topic_...n_25452,0.html funktioniert mit neueren Office-Formaten auch nicht.

Tests wurden durchgeführt auf
  • Win7 64bit
  • Delphi XE
  • Office 2003 und 2013

Vielen Dank
Gerd
Angehängte Grafiken
Dateityp: jpg Explorer.jpg (49,4 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
 


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 11:25 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