none
Word Dokument öffnen, Inhalt lesen RRS feed

  • Frage

  • Hallo werte Gemeinde,

    ich habe folgendes Ziel:

    Ich möchte Word-Dokumente öffnen und nach bestimmten Inhalten durchsuchen. Dabei geht es zum Beispiel darum, ein Datum an einer bestimmten Stelle auszulesen.
    Mein Problem beginnt aber schon damit, daß ich die Word-Dokumente gar nicht geöffnet bekomme. Ich gehe folgenden Weg:

    $Word = New-Object -comobject Word.Application
    $Dokument = $Word.Documents.Open("D:\Test.doc")
    
    
    In einer Domänenumgebung passiert nun folgendes:

    Es öffnet sich eine Abfrage, das Dokument wäre schon geöffnet, ob ich es schreibgeschützt öffnen möchte. Die Datei ist aber noch gar nicht geöffnet und die Abfrage blockiert jedes weitere Arbeiten des Skripts.

    Umgebung: Windows 7 Prof, W2k8 Domäne, Office 2010

    Wo liegt mein Fehler?

    Gruß

    Mittwoch, 10. August 2011 08:23

Antworten

  • Also, man muß da ein bisschen tricksen. Den Text kannst du hiermit in eine Variable übertragen:

    $Word = New-Object -comobject Word.Application
    $Word.Visible = $true
    $Dokument = $Word.Documents.Open("D:\Test2.docx")
    
    $word.ActiveWindow.selection.WholeStory() 
    $word.ActiveWindow.Selection.Copy()
    
    $text = [System.Windows.Forms.Clipboard]::GetText()
    $text
    
    [System.Windows.Forms.Clipboard]::Clear()
    $Word.quit()
    


    Word wird geöffnet, der gesamte Text markiert und in die Zwischenablage kopiert. Dann lesen wir die Zwischenablage wieder aus (Powershell bietet das leider nicht, daher wird hier WinForms benutzt) und übertragen sie in $text.

    Am Ende wird die Zwischenablage wieder gelöscht, weil sich sonst Word nicht schliessen ließe, da die Abfrage "Sie haben viel Text in die Zwischenablage kopiert.." kommt.

    Was die Kopfzeile betrifft, ist das deutlich komplizierter, siehe hier. Da müsste man sich mit beschäftigen, den Code in Powershell zu übertragen. Hab ich momentan keine Zeit zu. Wenns nicht eilt kann ichs mir die Tage vielleicht nochmal anschauen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Donnerstag, 11. August 2011 11:24
    Moderator
  • Eigentlich solltest du ohne die Eigenschaft ".visible = $true" gesetzt zu haben, gar nichts sehen. Ich denke das deine Datei wirklich schon geöffnet ist, aber in einem unsichtbaren (ohne Fenster) Prozess im Hintergrund.

    Öffne mal den Taskmanager und schliesse alle Word-Prozesse die du findest und dann probiers nochmal so:

    $Word = New-Object -comobject Word.Application
    $Word.Visible = $true
    $Dokument = $Word.Documents.Open("D:\Test.doc")
    

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Mittwoch, 10. August 2011 13:15
    Moderator

Alle Antworten

  • Eigentlich solltest du ohne die Eigenschaft ".visible = $true" gesetzt zu haben, gar nichts sehen. Ich denke das deine Datei wirklich schon geöffnet ist, aber in einem unsichtbaren (ohne Fenster) Prozess im Hintergrund.

    Öffne mal den Taskmanager und schliesse alle Word-Prozesse die du findest und dann probiers nochmal so:

    $Word = New-Object -comobject Word.Application
    $Word.Visible = $true
    $Dokument = $Word.Documents.Open("D:\Test.doc")
    

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Mittwoch, 10. August 2011 13:15
    Moderator
  • Super, das hat schon mal geklappt.

    Wie kann ich denn nun am dümmsten den Textinhalt des Dokuments einlesen? Im XML sind auch alle Grafiken etc drin, alles Inhalte, die ich nicht brauche. Ich brauche aber nur den reinen Textinhalt des Dokuments.

    Gruß

     

    Donnerstag, 11. August 2011 07:25
  • Das ist nicht so einfach wie es scheint. Was genau möchtest du denn mit dem Text machen?

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Donnerstag, 11. August 2011 10:28
    Moderator
  • Im brauche den Inhalt der Kopfzeile und aus dem Text ein Datum.

    Donnerstag, 11. August 2011 10:40
  • Also, man muß da ein bisschen tricksen. Den Text kannst du hiermit in eine Variable übertragen:

    $Word = New-Object -comobject Word.Application
    $Word.Visible = $true
    $Dokument = $Word.Documents.Open("D:\Test2.docx")
    
    $word.ActiveWindow.selection.WholeStory() 
    $word.ActiveWindow.Selection.Copy()
    
    $text = [System.Windows.Forms.Clipboard]::GetText()
    $text
    
    [System.Windows.Forms.Clipboard]::Clear()
    $Word.quit()
    


    Word wird geöffnet, der gesamte Text markiert und in die Zwischenablage kopiert. Dann lesen wir die Zwischenablage wieder aus (Powershell bietet das leider nicht, daher wird hier WinForms benutzt) und übertragen sie in $text.

    Am Ende wird die Zwischenablage wieder gelöscht, weil sich sonst Word nicht schliessen ließe, da die Abfrage "Sie haben viel Text in die Zwischenablage kopiert.." kommt.

    Was die Kopfzeile betrifft, ist das deutlich komplizierter, siehe hier. Da müsste man sich mit beschäftigen, den Code in Powershell zu übertragen. Hab ich momentan keine Zeit zu. Wenns nicht eilt kann ichs mir die Tage vielleicht nochmal anschauen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Donnerstag, 11. August 2011 11:24
    Moderator
  • Super!

    Das funktioniert genau so, wie ich mir das vorgestellt habe. Das Auffinden des gesuchten Datums war dann ein Kinderspiel.

    Für alle, dies es vielleicht interessiert:

     

    $Word = New-Object -comobject Word.Application
    $Word.Visible = $false
    $inhalt = $Word.Documents.Open("D:\test.doc")
    
    $inhalt.ActiveWindow.selection.WholeStory() 
    $inhalt.ActiveWindow.Selection.Copy()
    $text = [System.Windows.Forms.Clipboard]::GetText()
    $zeilen = [regex]::Split($text, "\n")
    
    for ($i = 0; $i -lt $zeilen.Count; $i++){
     if ([string]($zeilen[$i]).Contains("Zuletzt geändert") -eq $TRUE) {
     write-host $zeilen[$i].substring(17,10)
     $i = $zeilen.Count
     }
     }
     
    
    [System.Windows.Forms.Clipboard]::Clear()
    $Word.quit()
    

     


    Die Sichtbarkeit kann ruhig auf $false sitzen, es funktioniert auch unsichtbar.

    Für alle, die es nicht lesen können: Der Inhalt wird zeilenweise gesplittet und dann Zeile für Zeile nach dem entsprechenden Datum durchsucht. Sobald ich das Datum gefunden habe, breche ich die weitere Suche ab.

    Vielen Dank für die Hilfe!



    • Als Antwort markiert xploded Donnerstag, 11. August 2011 12:38
    • Tag als Antwort aufgehoben xploded Donnerstag, 11. August 2011 12:39
    Donnerstag, 11. August 2011 12:28
  • >Die Sichtbarkeit kann ruhig auf $false sitzen, es funktioniert auch unsichtbar.

    Sicher, dann ist es aber empfehlenswert mit Get-Process zu überprüfen, ob der Word-Prozess auch korrekt geschlossen wurde.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Donnerstag, 11. August 2011 15:05
    Moderator