Vielen Dank für das Interesse.
Der Hintergrund für meine Fragestellung war der Umstand, dass ich eine
variable Wortzählung geschrieben hatte, mit der einstellbar ist, ob
Aufzählungsbullets oder Nummerierungen gezählt werden, und welche
einzeln stehenden Zeichen nicht als Wort zählen sollen, z.B. Punkte,
Kommas u.ä., die als Tippfehler mit Leerzeichen davor im Text
auftauchen. (Übrigens zählt LO einen Einzelgedankenstrich [8211]
korrekterweise nicht als Wort, aber einen Einzelbindestrich [45] doch!)
Dazu verwende ich den Absatzcursor. Für das gesamte Dokument ist es
nicht so schwierig. Ich kann das Dokumenttextobjekt enumerieren und
erhalte Absätze und Tabellen. In den Tabellen kann ich über das Array
der Zellnamen jede Zelle erreichen. Das ganze läuft dann über die
Enumeration jedes Zelltextobjekts wiederum ab, so dass auch eingebettete
Tabellen gefunden werden. Textrahmen, Fuß- und Endnoten, sowie Kopf- und
Fußzeilen können auf Dokumentebene gelistet werden und wiederum über
deren Textenumerationen durchsucht werden.
Um dies alles zu testen, habe ich den pfiffigen Selektionsiterator
verwendet, den Andrew Pitonyak in OOME vorgestellt hat. Der hat
allerdings den Nachteil, dass er nur das Dokumenttextobjekt
berücksichtigt. Ich habe ihn daher modifiziert, so dass auch die
Textobjekte anderer Selektionen zum Zuge kommen.
So kann ich testrelevante Textbereiche auswählen, testen und
gleichzeitig über die Menüfunktion "Extras|Wortzählung" überprüfen, wie
LO zählt.
Im Zusammenhang mit Selektionen in Tabellen bemerke ich allerdings ein
paar Besonderheiten:
- Selektionen, die vor einer Tabelle beginnen und darüber hinaus gehen,
enthalten die gesamte Tabelle. Weitere Selektionen sind möglich.
- Neben Selektionen ganzer Zellbereiche einer Tabelle sind keine
weiteren Selektionen möglich.
- Neben Selektionen von Zellinhalten sind weitere Selektionen möglich.
- Selektionen von ganzen Zellbereichen einer Tabelle unterstützen den
Service "com.sun.star.text.TextTableCursor". In diesem Fall gibt es
keine Methode "getCount"!
- Alle anderen Selektionen unterstützen den Service
"com.sun.star.text.TextRanges", auch Selektionen in Textrahmen, Fußnoten
u.a.
- Interessanterweise gehört eine Selektion von Tabellenzellen, die mit
einer Zelle beginnt, in der Absätze mit Listen oder Nummerierungen sind
(nicht einmal zwingend im ersten Absatz), zu den TextRanges. Sehr seltsam.
Um auf die einzelnen Zellen eines selektierten Tabellenzellbereichs
zuzugreifen, könnte man den String RangeName parsen, was aber nur für
einfache Tabellenstrukturen möglich wäre. Für komplexe Tabellen
funktioniert das nicht. Eine Konversion des Cursors in einen CellRange
ist bei komplexen Tabellen leider fehlerhaft.
Ich helfe mir damit, dass ich stattdessen je nach Laune entweder alle
Zellen der Tabelle durchsuche oder gar keine.
Ein weiteres Problem habe ich auch noch nicht gelöst. Es kann vorkommen,
dass in einer einzelnen Selektion über mehrere Absätze hinweg ein am
Absatz verankerter Textrahmen komplett mit ausgewählt ist. Mein Versuch mit
oEnum = oSel.createContentEnumeration("com.sun.star.text.TextFrame")
endet in einem undifferenzierten Laufzeitfehler. Wenn ich dieses
Problem, nämlich ein Textrahmentextobjekt innerhalb einer Selektion zu
instantiieren, nicht lösen kann, werde ich es gesondert posten. (Es sei
denn, ihr habt eine schnelle Lösung.)
Schöne Grüße
Volker
Am 21.05.19 um 07:36 schrieb Thomas Krumbein:
Hallo Volker, Gerhard,
ich klinke mich mal kurz ein. Writer-Tabellen sind nicht ganz so einfach
zu verstehen. Auch wenn viele der typischen Tabellen-Methoden vorhanden
sind und intern korrekt ausgefüllt werden, ist der umgekehrte Weg (also
über die Eigenschaften / Methoden) auf z.B. selektierte Zellen zu
kommen, nicht möglich.
Wir hatten gerade im Forum einen sehr ähnlichen Fall diskutiert -
vielleicht hilft Dir das ein wenig weiter:
https://de.openoffice.info/viewtopic.php?f=18&t=72202
So ähnlich wirst Du auch vorgehen müssen...
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.