Tabellen auslesen

Moderator: ModerationP

Tabellen auslesen

Beitragvon Lobo_Gast » 13. Mai 2022, 14:19

Hallo!
Ein Dokument mit Inhaltsverzeichnis, Überschriften, Text und Tabellen.
Anhand der Überschriften und Tabellenunterschriften kann auf die Art des Inhalts der Tabellen geschlossen werden.
Wie erhalte ich bspw. für table(1) die übernächste Textzeile?

Gruß
Lobo
Lobo_Gast
 

Re: Tabellen auslesen

Beitragvon theoS » 13. Mai 2022, 20:57

Wie erhalte ich bspw. für table(1) die übernächste Textzeile?

Was meinst du damit genau?
Den 2. Absatz unter der Tabelle?
Vermutest du da drin die "Tabellenunterschrift"? [ich kenne den Begriff nicht aus dem Vokabular im Zusammenhang mit Word]
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5937
Registriert: 19. Apr 2008, 00:14

Re: Tabellen auslesen

Beitragvon Lobo_Gast » 16. Mai 2022, 12:04

Hallo Theo,
ja.
Ein unzugängliches System liefert Daten in Form von Dokumentationen.
Das Word-Dokument soll ausgewertet werden.
Die Überschriften enhalten Informationen zur folgenden Tabelle und die Zeile (unter der Zeile) unter der Tabelle weitere Informationen.
Zusammengenommen kann daraus auf den Inhalt der Tabelle geschlossen und die Daten der Tabelle interpretiert werden.

Wie bemerkt, bin ich nicht vertraut mit den Word-Begriffen und demnach erschliesst sich mir auch nicht das Objektmodell.
Ich benötige Grundlagen zur Erkennung der Dokumentstruktur und wie man sich darin bewegt.
Man sollte meine, das xml-file wäre hierfür perfekt, aber da sind mir zu viele 'Unbekannte' verbaut, um hier effektiv zu einer Lösung zu kommen.

Mir liegt ein Beispiel vor, in dem mit Sektionen, Paragraphen und Tabellen gearbeitet wird.
Die Paragraphen werden aufgelistet und nach Typ kategorisiert.
Tabellen kommen dabei nicht vor. Diese werden separat mit wdDoc.Sections(2).Range.Tables(idx) abgearbeitet.
Ihre Position in/zwischen den Paragraphen ist dabei unbekannt.

Die Behandlung der Paragraphen erscheint sehr zeitintensiv. Vielleicht gibt es schnellere Methoden.

Gruß
Lobo
Lobo_Gast
 

Re: Tabellen auslesen

Beitragvon theoS » 16. Mai 2022, 12:48

Kannst du mal ein Muster hochladen?
Nur dass man die Struktur erkennen kann und was du genau haben willst.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5937
Registriert: 19. Apr 2008, 00:14

Re: Tabellen auslesen

Beitragvon DerHoepp » 16. Mai 2022, 13:41

Moin,

für den zweiten Absatz unter jeder Tabelle funktioniert das folgende:
Code: Alles auswählen
Option Explicit

Sub list_it()
    Dim t As Table
    For Each t In Me.Tables
        Debug.Print t.Range.Next(wdParagraph).Next(wdParagraph).Text
    Next t
End Sub

Die Position der Tabelle in Relation zur Überschrift darüber ist etwas komplexer.

Viele Grüße
derHöpp

[Nachtrag:] Die überschrift vorher lässt sich über die .GoTo-Methode ermitteln:
Code: Alles auswählen
Option Explicit

Sub list_it()
    Dim t As Table
    Dim h As Range
    For Each t In Me.Tables
        Set h = Me.Range(t.Range.Start - 1).GoTo(wdGoToHeading, wdGoToPrevious).Paragraphs(1).Range
        Debug.Print h.Text & " - " & t.Range.Next(wdParagraph).Next(wdParagraph).Text
    Next t
End Sub
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 10402
Registriert: 14. Mai 2013, 11:08

Re: Tabellen auslesen

Beitragvon F_en » 17. Mai 2022, 07:45

Hallo,

was bedeutet:

Ein unzugängliches System liefert Daten in Form von Dokumentationen.


mfg
F_en
 

Re: Tabellen auslesen

Beitragvon Lobo_Gast » 17. Mai 2022, 10:09

Hallo,
vielen Dank für die Ansätze.
Das sieht vielversprechend aus.
Eine Beispieldatei kann ich von hier aus nicht bieten.
'Unzugänglich' bedeutet das Fehlen einer Schnittstelle für den Zugriff auf Struktur und Daten.

Gruß
Lobo
Lobo_Gast
 

Re: Tabellen auslesen

Beitragvon theoS » 17. Mai 2022, 10:36

ich meinte natürlich mit "Dummy-Daten", sowas kannst du auch von daheim schicken.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5937
Registriert: 19. Apr 2008, 00:14

Re: Tabellen auslesen

Beitragvon Lobo_Gast » 25. Mai 2022, 10:20

Hallo!
Die Ansätze erweisen sich wirklich als sehr hilfreich. Vielen Dank!

Bei vielen Zugriffen auf das Dokument steigt der Zeitaufwand erheblich.
Kann man Tabellen oder Textbereiche als Block/Array/Range einlesen?

Gruß
Lobo
Lobo_Gast
 

Re: Tabellen auslesen

Beitragvon theoS » 27. Mai 2022, 22:00

Kann mir vorstellen, dass du den Range des Dokuments komplett in eine Variable lesen kannst und die Bearbeitung dann da drin abwickelst. Könnte ein wenig schneller sein. Die Tabellen sind ja eigentlich in der Auflistung .tables() schon im in einer Collection. Was da bremst ist das Auslesen der darauf folgenden Absätze im Dokument. Was da vermutlich schon was bringen kann ist das Aktualisieren des Bildschirms abzuschalten. Und, ich hoffe, du verzichtest bei der Abarbeitung konsequent auf das Selection-Objekt!
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5937
Registriert: 19. Apr 2008, 00:14

Re: Tabellen auslesen

Beitragvon Lobo_Gast » 31. Mai 2022, 10:29

Hallo Theo,
ich nehme an, das Range-Objekt ist nicht im 'Speicher der Prozedur', sondern greift weiterhin auf das Dokument zu. Also wahrscheinlich keine Geschwindigkeitsvorteil.
In Excel wuerde ich es so machen:
Code: Alles auswählen
set rRng=Range(...
vDat=rRng

Mit Word funktioniert das in Excel soweit auch, aber mit vDat kann ich nichts anfangen.

Bei einem weiteren Problem versuche ich die Ueberschriften aufzulisten und die Anzahl der Tabellen zwischen ihnen zu bestimmen.
Funktioniert aber nicht (Type mismatch):
Code: Alles auswählen
Debug.Print oDoc.Range(rRng1, rRng2).Tables.Count

Im Anschluss will ich auf die Tabellen zugreifen.

Heute abend haenge ich eine Datei zur Ansicht an.

Gruss
Lobo
Lobo_Gast
 

Re: Tabellen auslesen

Beitragvon theoS » 02. Jun 2022, 12:12

Ja, das mit dem Range in Word wird doch ein klein wenig anders gehandhabt als in Excel. :)
Vom Prinzip her ist ein Word-Dokument wie eine Perlenkette bei der jede Perle ein "Zeichen" ist. Kann aber auch ein anderes Objekt sein wie z.B. ein InlineShape oder eine Tabelle.
Wenn du den Range richtig definierst, dann kann da auch alles was sich zählen lässt gezählt werden.
Mal ein Beispiel.
Code: Alles auswählen
Sub su_TabZaeler()
Dim dd1 As Document: Set dd1 = ActiveDocument
Dim rngDoc As Range, rngTeil As Range, tB As Table
Debug.Print dd1.Tables.Count
 Set rngDoc = dd1.Content
  Debug.Print rngDoc.Tables.Count
 'ich mache hier weiter mit einem Range der in meinem Probedoc 3 Tabellen enthält:
 Set rngTeil = dd1.Range(1, 2200) 'Ranges werden immer mit Long angegeben
 'hier: von "Zeichen" 1 bis 2200. Das ist wie auf einer Perlenkette
 
  Debug.Print rngTeil.Tables.Count 'wenn der Range Tabellen enthält, dann wird das auch gezählt.
  'hier kommt jetzt die Ermittlung des "Absatzes drüber"
  'auch das ist Grundschulrechnen. Du ermitteltst die Startposition der Tabelle
  'und von dort gehst du eins zurück, lässt dir den Text des Absatzes anzeigen.
   For Each tB In rngTeil.Tables
    Debug.Print tB.Range.Start  'Startposition, kann auch zur weiternutzung praktischerweise in eine Variabel
    Debug.Print dd1.Range(tB.Range.Start - 1, tB.Range.Start - 1).Paragraphs(1).Range.Text
   Next tB

End Sub
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5937
Registriert: 19. Apr 2008, 00:14

Re: Tabellen auslesen

Beitragvon Lobo_Gast » 03. Jun 2022, 07:27

Hallo Theo!
'Verstehen' und 'Verstanden' liegen manchmal weit auseinander.
Der Inhalt eines Dokumentes ist eine Zeichenkette (String). Ein 'Range' ist ein Ausschnitt davon. 'Start' und 'End' sind Positionen auf dem String.
Man bewegt sich nicht objektorientiert im DOM des xml-Files, sondern linear auf dem simplen String. Immerhin gibt es Aufzählungen wie Tabellen und Fußnoten. Die Aufzählung der Überschriften vermisse ich allerdings.

In meinem Fall war ich davon ausgegangen, das eine Tabelle durch die Überschrift aufwärts und die Zeile abwärts thematisch eingeordnet werden kann.
Den Ansatz, von der Auflistung der Tabellen auszugehen, habe ich verworfen und mich erst der Struktur gewidmet.
Erst werden die Kapitel aufgelistet '...Goto(wdGoToHeading, wdGoToNext).Paragraphs(1).Range'.
Anhand '...ListFormat.ListString' wird die Ebene der Überschrift ermittelt.
Jetzt kann das Ende eines Kapitels bestimmt werden.

Im Anschluss die Tabellen. Die Position ist bekannt und die Zeile darunter gibt Informationen zur Art des Inhalts.
Mit den Bereichen der Kapitel (von der niedrigsten zur höchsten Ebene) können die Tabellen zugeordnet werden.

Es gibt einen Sonderfall, bei dem in einem Kapitel auf ein Unterkapitel noch einmal eine Tabelle folgt. Dann wird die Tabelle dem Unterkapitel zugeordnet. Das ist falsch.
Das ist schon beim normalen Lesen verwirrend. Es muss gesondert abgefangen werden.

Soviel zur Struktur. Jetzt geht es an die Daten...

Gruß und Dank
Lobo
Lobo_Gast
 

Re: Tabellen auslesen

Beitragvon DerHoepp » 03. Jun 2022, 09:40

Moin,

wenn ich da nochmal kurz klarstellen darf:
Der Inhalt eines Dokumentes ist eine Zeichenkette (String).

Nein, der Inhalt eines Dokumentes sind StoryRanges, die Abschnitte enthalten (Sections), die Absätze enthalten (Paragraphs), die aus Zeichen bestehen (kein String, weil mehr als nur Text codiert ist, Schriftart, Zeichengröße, Farbe, Absatzabstände, Formatvorlagen etc). Ein Range ist ein Objekt, welches einen Teilbereich von Zeichen enthält und durch eine Start- und Endposition definiert ist.
Man bewegt sich nicht objektorientiert im DOM des xml-Files, sondern linear auf dem simplen String.

Nein, du kannst dich durchaus im DOM bewegen, vielleicht hast du nur eine hierarchischere Vorstellung des Objektmodells, als es tatsächlich existiert. Absätze im Fließtext sind keine Tochterelemente von Absätzen mit Überschriftsformatierung, sondern eben nur Absätze, die nach einem anderen Absatz positioniert sind. Tabellen sind ein kleiner Sonderfall, weil sie keine eigenen Absätze sind, sondern selbst Absätze enthalten.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 10402
Registriert: 14. Mai 2013, 11:08

Re: Tabellen auslesen

Beitragvon theoS » 03. Jun 2022, 11:28

Das hast du schön erklärt, Hoepp :)
Klar, ich hab auch nur bildlich von "Zeichen" gesprochen dass man sich das besser vorstellen kann.
Tatsächlich ist der Vergleich mit einer Perlenkette besser. Jede Perle ist anders und so ist das auch bei den "Perlen" in Word.
Ein Buchstabe ist da nur ein verschwindend geringer Teil des Objektmodells.
Ein Range ist ein Objekt, welches einen Teilbereich von Zeichen enthält und durch eine Start- und Endposition definiert ist

Ergänze jetzt noch die Zeichen durch Tabellen, Shapes, Inlineshapes, Bookmarks... also so knapp alles was das Word Objektmodell hergibt und du kannst dir ungefähr ein Bild vom Range machen.

Wenn du auf die Überschriften mit goto zugreifst, bewegst du dich automatisch im "Selection-Modus", was bei langen Dokumenten unglaublich bremst. (Hatte ich die Frage schon gestellt?)
Da das mit den Überschriften nicht so ist wie du dir das vorstellst, hat Hoepp ja schon schön gesagt.
Was steckt hinter goto? tatsächlich springt das zu einer vordefinierten Bookmark in der Selection die die Überschrift umfasst. (und mehr)
Wenn du das im Arbeitsspeicher erledigen willst, gehtst du die Absätze durch und überprüfst den outlinlevel, also die Ebene der Überschrift.
mit dem Schnipsel hier bekommst du alle Überschriften die mit "Überschrift1" formatiert sind (wenn das der Ersteller tatsächlich damit gemacht hat.
Code: Alles auswählen
Sub su_Ueberschrift()
Dim dd1 As Document: Set dd1 = ActiveDocument
Dim paR As Paragraph
 For Each paR In dd1.Paragraphs
  If paR.OutlineLevel = wdOutlineLevel1 Then
  Debug.Print paR.Range.Text
  End If
 Next paR
End Sub

Wenn das dann manuell formatiert wurde, dass nur die Zeichen so aussehen wie eine Überschrift bekommt das noch mal ein anderes Gesicht.
So kannst du aber dann auch unterscheiden zwischen Ebene 1 und 2.
die Logik dahinter dürfte klar sein.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5937
Registriert: 19. Apr 2008, 00:14

Nächste

Zurück zu Word Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste