Word Dokument durchsuchen und Infos rausfiltern

  • Huhu
    Ich hab nen *.doc Dokument und in der ist eine Tabelle.
    Ich würde gern die Daten da raus filtern und in AutoIt weiter verarbeiten.

    Ich lad ma nen Beispielfile hoch.
    Ich werd mich noch ein wenig versuchen und wenn ich weiter bin editiere ich den Beitrag.
    Aber wenn wer schon auf anhieb weiß wie es geht, dann her damit xD

    EDIT:
    OK es hat ein wenig Zeit muss jetzt erst einmal was anderes erledigen.
    Ich werd wohl erst in einer Woche dazu kommen.
    Wenn ihr was wisst, ich schau ab und an hier rein^^

    • Offizieller Beitrag

    Es geht - aber ein Problem ist, wenn die Inhalte sich von mal zu mal unterscheiden (Zeilen innerhalb eines Feldes).
    Das Unterscheiden, ob mit Chr(13) ein Zeilenumbruch in der Zelle stattfindet oder die nächste Zeile erreicht wird oder das Tabellenende und somit ein 'normaler' Zeilenumbruch in Word erfolgt ist fast unmöglich.
    Aber schau dir mal diesen Link an: Link, Dort geht es genau um solche Probleme. Das Portieren von VBA nach AutoIt wird wohl keine Probleme bereiten.


    Edit:
    Hab mal ein Bsp. erstellt. Auslesen der ersten Tabelle.
    Das Entfernen von Chr(7) habe ich mit integriert - hab aber k.A. ob das in jeder Tabelle enthalten ist, oder nur in dieser.

    Spoiler anzeigen
    [autoit]

    #include <Word.au3>
    ; Zugriff auf geöffnetes Worddokument - anderenfalls _WordDocOpen() verwenden
    Local $oWordApp = _WordAttach ("E-Runde.doc - Microsoft Word", 'Title')
    ;~ Local $countTable = $oWordApp.ActiveDocument.Tables.Count ; falls Anzahl Tabellen unbekannt und alles ausgelesen werden soll
    Local $rows, $columns, $val

    [/autoit] [autoit][/autoit] [autoit]

    ; Tabelle 1 hat in Zeile-1 Überschrift - wird nicht ausgelesen, da Spaltenzahl ungleich der Spalten in den Einträgen
    ConsoleWrite('Tabelle1 - Teilnehmer:' & @CRLF)
    $rows = $oWordApp.ActiveDocument.Tables(1).Rows.Count
    $columns = $oWordApp.ActiveDocument.Tables(1).Columns.Count

    [/autoit] [autoit][/autoit] [autoit]

    $i = 1 ; Zeile
    $j = 1 ; Spalte
    While True
    $i += 1
    If $i = $rows +1 Then
    $i = 2
    $j += 2
    EndIf
    If $j = 5 And $i = 2 Then ConsoleWrite('Tabelle1 - Verteiler:' & @CRLF)
    If $j > $columns Then ExitLoop

    $oWordApp.ActiveDocument.Tables(1).Cell($i,$j).Select
    $val = StringReplace(StringStripWS($oWordApp.Selection.Text, 3), Chr(7), '')
    If $val <> '' Then ConsoleWrite($val)

    $oWordApp.ActiveDocument.Tables(1).Cell($i,$j+1).Select
    $val = StringReplace(StringStripWS($oWordApp.Selection.Text, 3), Chr(7), '')
    If $val <> '' Then ConsoleWrite($val)
    WEnd

    [/autoit]
  • Falls es jemanden interessiert, ich habs wie folgt gelöst:

    Spoiler anzeigen
    [autoit]

    Global $iTabellen = $oWordApp.ActiveDocument.Tables.Count

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aTabelle[1][4]

    [/autoit] [autoit][/autoit] [autoit]

    $oTabelle = $oWordApp.ActiveDocument.Tables(2)
    ReDim $aTabelle[$oTabelle.Range.Rows.Count][$oTabelle.Range.Columns.Count]
    $iColumn = 0
    $iRow = 0
    For $oZelle In $oTabelle.Range.Cells
    $strText = $oZelle.Range.Text
    If $iColumn == 1 Then
    $aTemp = StringRegExp($strText,"([BIM])[^BIM]*([BIM]*)[^BIM]*([BIM]*)",1,1)
    $sTemp = ""
    For $k = 0 To UBound($aTemp)-1
    $sTemp &= $aTemp[$k] & " "
    Next
    $sTemp = StringTrimRight($sTemp,1)
    $aTabelle[$iRow][$iColumn] = $sTemp
    ElseIf $iColumn == 2 Then
    $aTabelle[$iRow][$iColumn] = StringTrimRight($strText,3)
    ElseIf $iColumn == 3 Then
    $aTemp = StringSplit(StringReplace(StringTrimRight($strText,2), @CR, '/'),"/")
    For $k = 0 To UBound($aTemp)-1
    $aTemp[$k] = StringStripWS($aTemp[$k],3)
    Next
    $sTemp = ""
    $aTemp = _ArrayUnique($aTemp, 1, 1)
    For $k == 1 To $aTemp[0]
    If $aTemp[$k] <> "" Then $sTemp &= $aTemp[$k] & "/"
    Next
    $sTemp = StringTrimRight($sTemp,1)
    $aTabelle[$iRow][$iColumn] = $sTemp
    Else
    $aTabelle[$iRow][$iColumn] = StringTrimRight($strText,2)
    EndIf

    $iColumn += 1
    If $oZelle.Column.IsLast == True Then
    $iRow += 1
    $iColumn = 0
    EndIf

    Next

    [/autoit]