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
Antwort Antwort
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
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
55 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 14. Sep 2014, 18:19
Es gibt eine neuere Version von dsofile auf der Microsoft Webseite. Damit funktioniert es bei mir mit Office 2010.
Gruß Kompi
Detlef Schmitz
  Mit Zitat antworten Zitat
norwegen60

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

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

  Alt 14. Sep 2014, 22:06
Hallo kompi,

ich habe schon einige Versionen von DsoFile.dll runtergeladen. Auch 64-bit-Versionen. Das Problem blieb immer dasselbe. Auch die Aussagen diesbezüglich sind nicht ganz klar. Die einen sagen, es liegt an der Inkompatibilität 32/64-bit, andere an dem neuen Aufbau der Filestruktur seit Office 2007. Ich denke auch, dass es eher an letzterem liegt.

Kannst du mir die DsoFile.dll anhängen oder den Link geben?

Danke
Gerd
  Mit Zitat antworten Zitat
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
55 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 15. Sep 2014, 18:44
Hallo norwegen60,

hier ist der Link:http://www.microsoft.com/en-us/downl...s.aspx?id=8422

Unter Details findet man die Information, dass dsofile nun auch für das Officeformat ab 2007 funktioniert.

Ich selber habe dies zwar nicht mit Delphi ausprobiert, aber unter Excel mit VBA. Hier habe ich die Informationen von Word - Dateien (docx und docm) ausgelesen.

Funktioniert seit längerem problemlos.

Gruß Kompi.
Detlef Schmitz
  Mit Zitat antworten Zitat
norwegen60

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

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

  Alt 12. Okt 2014, 14:09
Hallo,

ich habe mal diverse Versuche mit der DsoFile-Version gemacht, die du genannt hast. Es ist übrigens die Version, die ich auch schon verwendet habe.

Ich habe die beiden Demoversionen FilePropDemoVB7 und ..VB7 getestet. In meinem Original Win7-64 mit installiertem Office2003 habe ich es nach einigen Versuchen geschafft, dass beide Tetsversionen sowohl DOC als auch DOCX gelesen haben. Leider hat danach meine in ein Delphiprogramm installierte Version nicht mehr funktioniert. Da die Tests der VB-Programme auch erst nach einigem hin und her liefen habe ich mal alles in einer absolut neuen VirtualBox testen wollen.

Mit folgendem Ergebnis:
Code:
Start auf neuer VirtualBox mit Win7-64 und Office2003 SP3

Testlauf 1
==========
Test 1: DsoFile-Verzeichnis in neues Win7 kopiert
  FilePropDemoVB6 meldet bei Start "Component 'ComDlg32.ocx' missing"
  FilePropDemoVB7 meldet "COM-Klassenfactory .. mit CLSID (589....) honnte .. nuícht aufgerufen werden

Test 2: Der Demo beiligende DsoFile.dll mit Admin-Rechten registriert
  FilePropDemoVB6 meldet bei Start "Component 'ComDlg32.ocx' missing"
  FilePropDemoVB7 funktioniert mit .doc
  FilePropDemoVB7 meldet bei .docx Klasse nicht registriert (0x80010154 (REGDB_E_CLASSNOTREG))

Test 3: ComDlg32.ocx aus Internet runtergeladen und als Admin registriert
  FilePropDemoVB6 funktioniert mit .doc
  FilePropDemoVB6 meldet bei .docx "Error: ActiveX component can´t create object"
  FilePropDemoVB7 funktioniert mit .doc
  FilePropDemoVB7 meldet bei .docx Klasse nicht registriert (0x80010154 (REGDB_E_CLASSNOTREG))

Testlauf 2
==========
Test 1: Office2007 FileFormatConverters und DsoFileSetup_KB224351_x86 als Admin installiert
  FilePropDemoVB6 meldet bei Start "Component 'ComDlg32.ocx' missing"
  FilePropDemoVB7 funktioniert mit .doc
  FilePropDemoVB7 meldet bei .docx "Der Name "" ist ungültig (0x800300FC (STG_E_INVALIFNAME))

Test 2: ComDlg32.ocx aus Internet runtergeladen und als Admin registriert
  FilePropDemoVB6 funktioniert mit .doc
  FilePropDemoVB6 meldet bei .docx "Error: File not found"
  FilePropDemoVB7 funktioniert mit .doc
  FilePropDemoVB7 meldet bei .docx "Der Name "" ist ungültig (0x800300FC (STG_E_INVALIFNAME))

Wenn die DOCX noch von einem anderen Programm geöffnet ist, wird dies aber von VB6 und VB7 gemeldet (Datei gesperrt)
Hat jemand eine Idee, was ich machen muss, damit zumindest mal die VB-Demos funktionieren?

Danke
Gerd
  Mit Zitat antworten Zitat
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
55 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 12. Okt 2014, 20:51
Hallo,

Da ich z.Z. in Urlaub bin und meinen Computer nicht mithabe, muss ich Dich auf Ende der Woche vertrösten. Nur so viel. Ich verwende ebenfalls Win 7 64. Allerdings habe ich die Beispiele mit Excel 2010 erstellt. Dsofile muss installiert werden. Dabei wird die dll auch registriert. In dem Verzechnis befindet sich dann der komplette Source Code und Beispiele.

Gruß Kompi

PS: es könnte sein, dass docx Deinem System nicht bekannt ist. Versuche mal die Erweiterung zum Lesen der neuen Formate mit Office 2003 zu installieren.
Detlef Schmitz

Geändert von kompi (12. Okt 2014 um 20:55 Uhr)
  Mit Zitat antworten Zitat
norwegen60

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

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

  Alt 12. Okt 2014, 21:25
Hallo,

der Unterschied zwischen Installation und Kopie war eigentlich nur der, dass bei Installation auch gleich die DsiFile.dll registriert wurde. Allerdings nur, wenn die Installation als Admin erfolgte.

Um sicherzugehen, dass docx sauber funktioniert, hatte ich bereits ein Dokument als DOC und als DOCX gespeichert. Hatte aber auch nichts gebracht. Die VB-Demos laufen bis jetzt nicht sauber.

Mein Problem mit Delphi habe ich aber lösen können. Bisher hatte ich die Properties mithilfe der Unit DSOleFile_TLB ausgelesen. Nachdem ich auf DsoFile_TLB umgestellt habe und dort noch die ClassID angepasst habe, funktioniert das Einlesen der Properties sowohl bei DOC als auch DOCX.

Danke und Grüße
Gerd
  Mit Zitat antworten Zitat
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
55 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 30. Okt 2014, 21:45
Hallo norwegen60,

anbei Code mit VBA Excel 2010, der zeigt, wie man auf dsofile zugreift.

sub lesedir(adir As String)
Dim fs, f, fd, fe
Dim docliste
Dim i As Integer
Dim ws As Worksheet
Dim s, s1 As String
Dim actsheet As Worksheet
Dim objfile As DSOFile.OleDocumentProperties
Dim csum As DSOFile.SummaryProperties
Dim ks As String
Dim k As Integer
Set actsheet = ActiveSheet
Set fs = CreateObject("Scripting.Filesystemobject")
Set f = fs.getfolder(adir)
Set fd = f.Files
Set ws = Worksheets("Dokumente")
Set docliste = ws.Range("Dokumentenliste")
docliste.ClearContents
Set objfile = CreateObject("DSOFile.oledocumentproperties")
i = 1
Application.ScreenUpdating = False
ws.Select
For Each fe In fd
s = fe.Name
s1 = fe.Type
If InStr(1, s1, "Microsoft Word") > 0 Then
On Error GoTo weiter1
ks = Left(s, 3)
k = CInt(ks)
docliste(k, 2) = s
objfile.Open (adir & "\" & s)
Set csum = objfile.SummaryProperties
docliste(k, 1) = csum.Title
objfile.Close
i = i + 1
weiter1:
On Error GoTo 0
End If
Next fe
Set csum = Nothing
Set objfile = Nothing
Set docliste = Nothing
Set fd = Nothing
Set f = Nothing
Set fs = Nothing
actsheet.Select
Application.ScreenUpdating = True
End Sub

Ich hoffe, das hilft Dir Dein VB Problem auch noch zu lösen.

Im übrigen kann man dies genauso mit Delphi lösen. Man muss nicht umständlich eine .._tlb - Datei erstellen.

Gruß Kompi
Detlef Schmitz
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:05 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