Einzelnen Beitrag anzeigen

norwegen60

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

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

  Alt 14. Sep 2014, 15: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
Miniaturansicht angehängter Grafiken
explorer.jpg  
  Mit Zitat antworten Zitat