Word-Datei auslesen mit Win32::OLE
Piet
- perl
0 Klaus Mock0 Piet0 Klaus Mock0 Piet0 Klaus Mock0 Piet
0 Philipp Hasenfratz
Hallo zusammen,
hier der zweite Versuch, den Inhalt von MS-Word-Dateien auszulesen. Diesmal mit Win32::OLE - was ich mir mal wieder einfach vorgestellt hatte, führt aber doch zügig in für meine Verhältnisse etwas zu tiefes Fahrwasser (s.u.)
Ein Prob dabei ist, dass ich bislang nirgendwo eine Erläuterung auftreiben konnte, wie das korrekter weise zu bewerkstelligen wäre (die Perl-Welt scheint sich hier nur mit Excel-dateien zu beschäftigen). Also habe ich mal ausgehend von einem Script aus einem buch eine Vermutung angestellt, wie das für Word-Dateien aussehen könnte:
#!/usr/bin/perl
use Win32::OLE;
use strict;
my ($word, $file, $dokument);
$word=Win32::OLE->new('Word.Application', 'Quit')
or die ("Kein Objekt: ", Win32::OLE->LastError());
$file="test.doc";
$dokument=$word->Documents->Open($file)
or die ("Kann Dokument nicht öffnen: ", Win32::OLE->LastError());
Ab hier steh ich dann langsam im Wald...
...wenn ich testhalber erstmal nur doof schreibe:
print "$dokument";
kommt als anzeige:
Win32::OLE=HASH(0x178148c)
Eine Referenz also, soviel sehe ich immerhin noch ;-)
Aber damit ist mir dann auch endgültig klar, dass ich spätestens ab hier keine Ahnung mehr habe. Könnte mir jemand kurz auf die sprünge helfen, wie ich nun an meinen Datei-Inhalt rankomme?
Beste Grüße
Piet
Hallo,
Ein Prob dabei ist, dass ich bislang nirgendwo eine Erläuterung auftreiben konnte, wie das korrekter weise zu bewerkstelligen wäre (die Perl-Welt scheint sich hier nur mit Excel-dateien zu beschäftigen).
Versuchs mal mit den Beispielen aus der Original-Modul-Distribution:
http://search.cpan.org/search?dist=Win32-OLE
Grüße
Klaus
Hi Klaus,
Du hattest schon wieder recht ;-) Hab leider nicht rechtzeitig auf Deine letzte Antwort reagieren können (paar lange Threads hier gestern).
Also: cpan bringt ein Stückchen weiter (als Nutzer von ActiveState vergess ich das manchmal...), aber den Durchbruch bringt das auch nicht als Struktur wird dort angegeben:
my $RefOf = $Object;
my $ValOf = valof $Object;
$Object->{Value} = $NewValue;
Auf meinen Versuch übertragen müsste das dann (wenn ich das richtig sehe) lauten:
$ref=$dokument;
$val=valof $dokument;
$dokument->{Value}=$inhalt;
Bei Start von der Kommandozeile gibts auch keine Fehlermeldung (allerdings auch keinen Datei-Inhalt). Der Perl-Editor von dzsoft meldet allerdings sehr wohl einen Fehler:
OLE exception from "Microsoft Word":
'Name' ist eine schreibgeschützte Eigenschaft.
Win32::OLE(0.1502) error 0x80020009: "Ausnahmefehler aufgetreten"
in PROPERTYPUT "Value" at 0cpan.pl line 26
Use of uninitialized value in string at 0cpan.pl line 30.
Tja: Wenn man wenigstens mal wüsste, was das nun für ein Hash ist, der da referenziert wird, könnte man sich ja vielleicht mal die keys ausgeben lassen, aber so...
Hast Du (oder sonst ein Wissender natürlich ;-) eine Ahnung, was man nun noch machen könnte?
Gruß & Dank
Piet
Hallo,
my $RefOf = $Object;
my $ValOf = valof $Object;
$Object->{Value} = $NewValue;
Hmm, ich weiß gar nicht wo Du das jetzt gerade her hast, aber das war sicher nicht, daß was ich gemeint habe.
Bei Start von der Kommandozeile gibts auch keine Fehlermeldung (allerdings auch keinen Datei-Inhalt).
Vermutlich weil Du kein, oder zu wenig Fehlerbandlungsanweisungen eingebaut hast. Gerade bei Themen, wo man sich grade neu heranwagt, solte man zu erst einmal Testcode schreiben, der Dir jeden Schritt genauestens ausgibt, und im Fehlerfalle eben auch die Fehler.
Tja: Wenn man wenigstens mal wüsste, was das nun für ein Hash ist, der da referenziert wird, könnte man sich ja vielleicht mal die keys ausgeben lassen, aber so...
Ich kann Dir aus leidvoller Erfahrung sagen, daß ein OLE-Objekt besser nicht mit Data::Dumper ausgegeben werden sollte, außer Du willst, daß Dein Rechner sich die nächste Zeit intensiv selbst beschätigt und Deine Auslagerungsdatei bis auf ANschlag verghrößert (Außer Du würgst das Script ab *g*)
BTW: In der HTML-Doku von Activestate ist auch der Win32::OLE::Browser ungebracht, der leider nur mit dem IE und installiertem PerlScript funktioniert. Damit kann man auch trefflich die OLE-Objekte nach Methoden und Eigenschaften durchsuchen. Eventuell kannst Du den Code dieses Browsers auch analysieren, um festzustellen, wie Du Dich durch ein OLE-Objekt durchhangeln kannst, um zu den gewünschten Informationen zu kommen.
Hast Du (oder sonst ein Wissender natürlich ;-) eine Ahnung, was man nun noch machen könnte?
Ja, Sieh Dir das Beispiel 'word2pod.pl' an. Darin wird ein Word-Dokument in eine Perl-Poddatei umgewandelt. Das sollte Dir eigentlich wirklich weiterhelfen.
Übrigens, folgendes Script schreibt den reinen Text eines Word-Dokuemts in eine gegebene Textdatei:
#!perl -w
use strict;
use Win32::OLE qw(in);
exit print "usage: $0 infile.doc outfile.txt" unless (scalar @ARGV == 2);
my($infile,$outfile) = @ARGV;
$infile = Win32::GetCwd() . "/$infile" if $infile !~ /^(\w:)?[/\]/;
$outfile = Win32::GetCwd() . "/$outfile" if $outfile !~ /^(\w:)?[/\]/;
my $Word = Win32::OLE->new('Word.Application', 'Quit')
or die "Couldn't run Word";
my $Doc = $Word->Documents->Open($infile) or die Win32::OLE->LastError();
open(OUT,">$outfile");
print OUT $Doc->{Content}->{Text};
close OUT;
exit;
Grüße
Klaus
Hi Klaus,
das war der entscheidende Tipp- recht vielen Dank.
Eigentlich fehlte mir nur die Zeile hier:
print OUT $Doc->{Content}->{Text};
Nun läuft die Umwandlung recht flüssig und ohne dass sich irgendwas aufhängt...
Nur ein Prob hab ich dabei noch: Die Zeilenumbrüche.
Wenn ich mir das mit Deinem Script geschriebene txt-File mit einem Editor (z.b. NOtepad) ansehe, werden die Returns/Sonderzeichen auch angezeigt.
Bei dem Versuch, auf übliche Weise daraus HTML zu produzieren (was ja mein eigentliches Ziel ist), kann ich die Dinger aber nicht mit
$outfile=~ s/(?:\015\012?|\012)/<br>/g;
umwandeln. Im html-File kommt der Text nur als ein unformatierter String an.
Weißt Du, was da los ist?
Gruß & Dank
Piet
Hallo,
$outfile=~ s/(?:\015\012?|\012)/<br>/g;
ein
$outfile=~ s/\r/<br>/g;
sollte funktionieren (bei mir macht esd as zumindest).
umwandeln. Im html-File kommt der Text nur als ein unformatierter String an.
Allerdings würde ich Dir empfehlen, daß Du Dir noch word2pod.pl genauer unter die Lupe nimmst. Mit etwas, äh Anpasungsarbeit, dürfte daraus ein durchaus brauchbares word2html.pl gebastelt werden können, a es die einzelne Absätze durchgeht, und Du somit auch eventuelle Überschriften und solche Sachen gut in HTML umsetzen könntest.
Grüße
Klaus
Hallohallo,
der Fehler mit dem Umbruch war mal wieder anderer Natur: Es war noch der Schlenker nötig, das Objekt in einer Variable abzulegen, um es dann durchsuchen zu können.
Tja, bei fehlender OOP-Erfahrung braucht sowas dann etwas länger :-}
Aber was nicht ist, das wird noch werden.
Allerdings würde ich Dir empfehlen, daß Du Dir noch word2pod.pl genauer unter die Lupe nimmst. Mit etwas, äh Anpasungsarbeit, dürfte daraus ein durchaus brauchbares word2html.pl gebastelt werden können, a es die einzelne Absätze durchgeht, und Du somit auch eventuelle Überschriften und solche Sachen gut in HTML umsetzen könntest.
Werd ich auf alle Fälle tun. Vorerst bin ich allerdings anspruchslos und erstmal völlig zufrieden. Für meine momentanen Zwecke reicht das schon. Ha: Da werd ich mir ein hübsches Ding schrauben, dass ca. 100 Windoof-Dateien in anständiges HTML verwandelt *freu*
Gruß & Dank
Piet
Halihallo
hier der zweite Versuch, den Inhalt von MS-Word-Dateien auszulesen. Diesmal mit Win32::OLE - was ich mir mal wieder einfach vorgestellt hatte, führt aber doch zügig in für meine Verhältnisse etwas zu tiefes Fahrwasser (s.u.)
Das hängt nich an OLE, sondern an Winword ;-)
Ein Prob dabei ist, dass ich bislang nirgendwo eine Erläuterung auftreiben konnte, wie das korrekter weise zu bewerkstelligen wäre (die Perl-Welt scheint sich hier nur mit Excel-dateien zu beschäftigen).
Also habe ich mal ausgehend von einem Script aus einem buch eine Vermutung angestellt, wie das für Word-Dateien aussehen könnte:
Ein kleiner Tip am Rande: VBA (VisualBasic for Applications, eg. Winword-VBA) benutzt intern auch nur den OLE-Access. Wenn du also Dokumentationen zum OLE-Interface brauchst, dürfte dir die Hilfestellungen der jeweiligen Programme unter VBA dienlich sein.
Ich habe leider noch nie mit OLE für Winword gearbeitet.
Viele Grüsse
Philipp