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