Writer-Texttabelle - Zellen aus einer UI-Selektion?

classic Classic list List threaded Threaded
5 messages Options
Volker Lenhardt Volker Lenhardt
Reply | Threaded
Open this post in threaded view
|

Writer-Texttabelle - Zellen aus einer UI-Selektion?

Mein Problem: Ich will im Writer mit einem Makro mit Hilfe der API auf
jede einzelne von mit der Maus selektierten Zellen einer (komplexen)
Texttabelle zugreifen.

Für die gesamte Tabelle gibt es die Methode getCellNames(), die
fehlerlos die Namen aller Zellen ausgibt, so dass ich jede Zelle mit
oTable.getCellByName(sName) instanziieren kann. So etwas fehlt sowohl
für den Service CellRange als auch für TextTableCursor.

Wie kann ich mein Ziel erreichen?

Sub GetEachCellInSelection(Optional oDoc, Optional oCellSel)
   Dim oTable, oCellRange, aCellNames() As String
   Dim sRangeName&

   If IsMissing(oDoc) Then oDoc = ThisComponent
   If IsMissing(oCellSel) Then oCellSel = oDoc.CurrentSelection

   If oCellSel.supportsService("com.sun.star.text.TextTableCursor") Then
     oTable = oDoc.CurrentController.ViewCursor.TextTable
     sRangeName = oCellSel.RangeName 'Hilft mir nicht weiter
     oCellRange = oTable.getCellRangeByName(sRangeName) 'Das auch nicht
     '????
   End If
End Sub

Bin ich einfach nur blind?

Volker

--
Liste abmelden mit E-Mail an: [hidden email]
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
Gerhard Weydt Gerhard Weydt
Reply | Threaded
Open this post in threaded view
|

Re: Writer-Texttabelle - Zellen aus einer UI-Selektion?

Hallo Volker,

ich habe aufgrund deiner Mail ein paar Sachen ausprobiert, bin aber auch
nicht weitergekommen. Dann wollte ich abwarten, ob jemand anders  etwas
Schlaues beiträgt. Nun komme ich zu dem Schluss, dass wir beide nicht
blind sind, sondern dass da womöglich wirklich nichts zur Verfügung
gestellt wird.

Gruß

Gerhard

Am 25.04.2019 um 19:22 schrieb Volker Lenhardt:

> Mein Problem: Ich will im Writer mit einem Makro mit Hilfe der API auf
> jede einzelne von mit der Maus selektierten Zellen einer (komplexen)
> Texttabelle zugreifen.
>
> Für die gesamte Tabelle gibt es die Methode getCellNames(), die
> fehlerlos die Namen aller Zellen ausgibt, so dass ich jede Zelle mit
> oTable.getCellByName(sName) instanziieren kann. So etwas fehlt sowohl
> für den Service CellRange als auch für TextTableCursor.
>
> Wie kann ich mein Ziel erreichen?
>
> Sub GetEachCellInSelection(Optional oDoc, Optional oCellSel)
>   Dim oTable, oCellRange, aCellNames() As String
>   Dim sRangeName&
>
>   If IsMissing(oDoc) Then oDoc = ThisComponent
>   If IsMissing(oCellSel) Then oCellSel = oDoc.CurrentSelection
>
>   If oCellSel.supportsService("com.sun.star.text.TextTableCursor") Then
>     oTable = oDoc.CurrentController.ViewCursor.TextTable
>     sRangeName = oCellSel.RangeName 'Hilft mir nicht weiter
>     oCellRange = oTable.getCellRangeByName(sRangeName) 'Das auch nicht
>     '????
>   End If
> End Sub
>
> Bin ich einfach nur blind?
>
> Volker
>


--
Liste abmelden mit E-Mail an: [hidden email]
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
Thomas Krumbein-3 Thomas Krumbein-3
Reply | Threaded
Open this post in threaded view
|

Re: Writer-Texttabelle - Zellen aus einer UI-Selektion?

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...

Viele Grüße

Thomas


Am 20.05.2019 um 23:48 schrieb Gerhard Weydt:

> Hallo Volker,
>
> ich habe aufgrund deiner Mail ein paar Sachen ausprobiert, bin aber
> auch nicht weitergekommen. Dann wollte ich abwarten, ob jemand anders 
> etwas Schlaues beiträgt. Nun komme ich zu dem Schluss, dass wir beide
> nicht blind sind, sondern dass da womöglich wirklich nichts zur
> Verfügung gestellt wird.
>
> Gruß
>
> Gerhard
>
> Am 25.04.2019 um 19:22 schrieb Volker Lenhardt:
>> Mein Problem: Ich will im Writer mit einem Makro mit Hilfe der API
>> auf jede einzelne von mit der Maus selektierten Zellen einer
>> (komplexen) Texttabelle zugreifen.
>>
>> Für die gesamte Tabelle gibt es die Methode getCellNames(), die
>> fehlerlos die Namen aller Zellen ausgibt, so dass ich jede Zelle mit
>> oTable.getCellByName(sName) instanziieren kann. So etwas fehlt sowohl
>> für den Service CellRange als auch für TextTableCursor.
>>
>> Wie kann ich mein Ziel erreichen?
>>
>> Sub GetEachCellInSelection(Optional oDoc, Optional oCellSel)
>>   Dim oTable, oCellRange, aCellNames() As String
>>   Dim sRangeName&
>>
>>   If IsMissing(oDoc) Then oDoc = ThisComponent
>>   If IsMissing(oCellSel) Then oCellSel = oDoc.CurrentSelection
>>
>>   If oCellSel.supportsService("com.sun.star.text.TextTableCursor") Then
>>     oTable = oDoc.CurrentController.ViewCursor.TextTable
>>     sRangeName = oCellSel.RangeName 'Hilft mir nicht weiter
>>     oCellRange = oTable.getCellRangeByName(sRangeName) 'Das auch nicht
>>     '????
>>   End If
>> End Sub
>>
>> Bin ich einfach nur blind?
>>
>> Volker
>>
>
>

--
Liste abmelden mit E-Mail an: [hidden email]
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
Volker Lenhardt Volker Lenhardt
Reply | Threaded
Open this post in threaded view
|

Re: Writer-Texttabelle - Zellen aus einer UI-Selektion?

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: [hidden email]
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
Volker Lenhardt Volker Lenhardt
Reply | Threaded
Open this post in threaded view
|

Re: Writer-Texttabelle - Zellen aus einer UI-Selektion?

Nur zur Ergänzung: über TextPortions komme ich sicher zum Ziel. Ich wollte aber den scheinbar vorhandenen schnellen und direkten Weg über die ContentEnumeration. Warum geht das nicht? Ein Bug?

Schöne Grüße
Volker

> Am 22.05.2019 um 15:07 schrieb Volker Lenhardt <[hidden email]>:
>
>
> 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.)


--
Liste abmelden mit E-Mail an: [hidden email]
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