Discussion:
Writer -> Tabelle mittels Makro ansprechen
Jochen
14 years ago
Permalink
Hallo *,

kann mir jemand bitte sagen, wie ich in Writer mittels eines Makros eine
Tabelle ansprechen kann, d.h. bei den Tabelleneigenschaften den
Spaltendialog aufrufen und bearbeiten kann.
"oTblColSeps = oTable.TableColumnSeparators" scheint nicht korrekt zu
sein (Objektvariable nicht belegt).

Den weiteren Verlauf des Makros kann ich wegen des o.g. Fehlers nicht
testen:
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps

LibreOffice 3.3.3 OOO330m19 (Build:301)
OS: Windows 7 Prof. (64 Bit)

Gruß

Jochen
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Peter Eberlein
14 years ago
Permalink
Hi Jochen,
Post by Jochen
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps
wenn das Makro im Dokument gespeichert ist dann:

Sub Main
oTable = thisComponent.TextTables.getByName("MeinTabellenname")
oTblColSeps = oTable.TableColumnSeparators
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps
End Sub

Gruß Peter
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Jochen
14 years ago
Permalink
Hallo Peter,
Post by Peter Eberlein
Sub Main
oTable = thisComponent.TextTables.getByName("MeinTabellenname")
oTblColSeps = oTable.TableColumnSeparators
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps
End Sub
Vielen Dank für Deinen Tipp. Aber es bestehen noch zwei Probleme:
1) Tabellenname:
In Deinem Beispiel wird die "MeinTabellenname" angesprochen. Das Problem
ist jedoch, dass ich das Makro auf verschiedenen Tabellen anwenden
möchte - und diese haben unterschiedliche Namen. Gibt es dafür eine Lösung?

2) Spaltenbreiten:
Die im Makro definierten Spaltenbreiten werden in der Tabelle nicht
übernommen.
Bemerkung: ich habe zuvor den Tabellennamen im Makro dem Tabellennamen
im Writer-Dokument angepasst, d.h. bei einem Testdokument lautet der
Tabellenname "Tabelle1".
Frage: hast Du das Makro konkret auf Funktionalität überprüft bzw. woran
kann es liegen, dass der Spaltenbreiten nicht wie gewünscht per Makro
eingestellt werden.

Gruß

Jochen
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Peter Eberlein
14 years ago
Permalink
...
Du kannst die Tabellen auch mit getByIndex() ansprechen (nullbasiert)...
Post by Jochen
Die im Makro definierten Spaltenbreiten werden in der Tabelle nicht
übernommen.
Bemerkung: ich habe zuvor den Tabellennamen im Makro dem Tabellennamen
im Writer-Dokument angepasst, d.h. bei einem Testdokument lautet der
Tabellenname "Tabelle1".
Frage: hast Du das Makro konkret auf Funktionalität überprüft bzw. woran
kann es liegen, dass der Spaltenbreiten nicht wie gewünscht per Makro
eingestellt werden.
Ja ich habe mal kurz durchgetestet. Hast Du Zellen gemerged? Wieviele
Spalten hat Deine Tabelle (im vorliegenden Fall müssten es mindestens 5
sein).

Peter
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Jochen
14 years ago
Permalink
Hallo Peter,
Post by Peter Eberlein
Du kannst die Tabellen auch mit getByIndex() ansprechen (nullbasiert)...
Syntax:
oTable = thisComponent.TextTables.getByIndex()

Frage: Spricht dieser Befehl eine beliebige Tabelle an, in der der
Cursor steht? Oder spricht dieser Befehl alle im Dokument vorhandene
Tabellen an?
Post by Peter Eberlein
Hast Du Zellen gemerged?
Nein. Die Testtabelle habe erstellt, indem ich
"1<Tabulator>2<Tabulator>3" (ohne Anführungszeichen)
eingegeben habe, die Zeile markiert habe und unter Tabelle -> Umwandeln
-> "Text in Tabelle" -> Trennzeichen im Text "Tabulator" angeklickt habe.
Die Testtabelle "Tabelle1" enthält jetzt nur eine (1) Zeile. Aber auch
mit zwei oder mehr Zeilen läuft das Makro auch nicht.
Post by Peter Eberlein
Wieviele Spalten hat Deine Tabelle (im vorliegenden Fall müssten es mindestens 5
sein).
Meine Testtabelle hat zu Testzwecken zwei, drei oder vier Spalten
enthalten. Aufgrund Deines Hinweises habe ich eine fünfte Spalte
eingefügt. Aber auch da tut sich nichts.

Ich verstehe auch nicht, warum
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
fünf Spalten anspricht und nicht drei Spalten?

Ich gehe davon aus, dass Du den Quellcode Deines Makros, das die
Spaltenbreite steuert bzw. die gewünschten Sapltenbreiten einstellt,
gepostet hast. Logischerweise muss der Fehler bei mir bzw. in meinem
Dokument liegen. Aber welcher?

Gruß

Jochen

PS: der Quellcode Deines Makros
Sub Main
oTable = thisComponent.TextTables.getByName("MeinTabellenname")
oTblColSeps = oTable.TableColumnSeparators
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps
End Sub
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Peter Eberlein
14 years ago
Permalink
Post by Jochen
Hallo Peter,
Post by Peter Eberlein
Du kannst die Tabellen auch mit getByIndex() ansprechen (nullbasiert)...
oTable = thisComponent.TextTables.getByIndex()
Frage: Spricht dieser Befehl eine beliebige Tabelle an, in der der
Cursor steht? Oder spricht dieser Befehl alle im Dokument vorhandene
Tabellen an?
getByIndex(0) spricht die erste, getByIndex(1) die zweite an usw.
Post by Jochen
Ich verstehe auch nicht, warum
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
fünf Spalten anspricht und nicht drei Spalten?
weil der Column Separator die Separierung zwischen den Spalten steuert,
da bleiben die erste und die letzte natürlich außen vor.

Gruß Peter
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Jochen
14 years ago
Permalink
Hallo Peter,

ich hoffe, dass ich Dich nicht allzu nerve. Aber für mich besteht noch
Diskussionsbedarf.
Post by Peter Eberlein
getByIndex(0) spricht die erste, getByIndex(1) die zweite an usw.
Mein Ziel ist es, dass ich in eine beliebige Tabelle klicke und dass das
Makro die Spalteneinstellung für diese Tabelle ausführt.
Der Weg über den Tabellennamen oder die "Tabellenziffer" ermöglicht dies
nicht. Gibt es da eine Lösungsmöglichkeit.

Quellcode Deines Makros:
Sub Main
oTable = thisComponent.TextTables.getByName("MeinTabellenname")
oTblColSeps = oTable.TableColumnSeparators
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps
End Sub

Dies löst in meinem Dokument keine Reaktion aus. Ich weiß nicht einmal,
ob der Fokus in die Tabelle springt und versucht, dort etwas auszulösen.

Hast Du noch eine Idee, wie ich da weiter kommen kann?
Was ist bei Dir anders, dass das Makro das macht, was er machen soll -
nämlich die Spaltenbreite einstellen?

LibreOffice 3.3.3 OOO330m19 (Build:301)
OS: Windoes 7 Prof. (64 bit)

Gruß

Jochen
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Peter Eberlein
14 years ago
Permalink
Post by Jochen
Hallo Peter,
ich hoffe, dass ich Dich nicht allzu nerve.
keineswegs
Post by Jochen
Post by Peter Eberlein
getByIndex(0) spricht die erste, getByIndex(1) die zweite an usw.
Mein Ziel ist es, dass ich in eine beliebige Tabelle klicke und dass das
Makro die Spalteneinstellung für diese Tabelle ausführt.
Der Weg über den Tabellennamen oder die "Tabellenziffer" ermöglicht dies
nicht. Gibt es da eine Lösungsmöglichkeit.
Da jede Tabelle eine unterschiedliche Anzahl von Spalten beheimaten
kann, macht es nur Sinn, wenn Du sicherstellen kannst, dass die Tabellen
gleich aufgebaut sind. Du kannst dann mit einer For-Schleife über alle
Tabellen iterieren (siehe Basic Hilfe). Oder man ermittelt den
Tabellenamen wie folgt über die Position des Cursors:


Sub Main
oViewCursor = ThisComponent.CurrentController.getViewCursor
if (not isEmpty(oViewCursor.getPropertyValue("TextTable"))) then
sTableName = oViewCursor.getPropertyValue("TextTable").Name
else
msgBox "Cursor steht nicht in Tabelle", 64
End if
oTable = thisComponent.TextTables.getByName(sTableName)
oTblColSeps = oTable.TableColumnSeparators
oTblColSeps(0).Position = 800
oTblColSeps(1).Position = 900
oTblColSeps(2).Position = 1600
oTable.TableColumnSeparators = oTblColSeps
End Sub
Post by Jochen
Dies löst in meinem Dokument keine Reaktion aus. Ich weiß nicht einmal,
ob der Fokus in die Tabelle springt und versucht, dort etwas auszulösen.
Der Focus/Cursor wird für die Aktionen nicht benötigt.
Post by Jochen
Hast Du noch eine Idee, wie ich da weiter kommen kann?
Was ist bei Dir anders, dass das Makro das macht, was er machen soll -
nämlich die Spaltenbreite einstellen?
Zieh mal eine neue fünfspaltige Tabelle auf und probier das Makro
Post by Jochen
LibreOffice 3.3.3 OOO330m19 (Build:301)
OS: Windoes 7 Prof. (64 bit)
ich habe OpenOffice 3.2.1, aber das sollte keinen Unterschied machen, an
diese API ist Libre bisher nicht rangegangen.

Gruß Peter
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Jochen
14 years ago
Permalink
Hallo Peter,

ich bin mehr oder weniger am Ziel angekommen.
<schnipp> Oder man ermittelt den
oViewCursor = ThisComponent.CurrentController.getViewCursor
if (not isEmpty(oViewCursor.getPropertyValue("TextTable"))) then
sTableName = oViewCursor.getPropertyValue("TextTable").Name
Damit habe ich Zugriff auf die Tabelle - wahrscheinlich auch schon
zuvor. Aber jetzt tut sich was. Ich habe dies mit LO 3.3 und LO 3.4
getestet.

So - jetzt noch zwei Anmerkungen:
1) Spaltenbreite:
Ich hatte noch ein Verständnisproblem bzgl. der Spaltenbreite. Beim
Googlen habe ich aber eine Erklärung gefunden:
The column separator specifies where the column ends as percentage of
the table width. A column end position of 5000 specifies 50% of the
table width. The macro in Listing 8.11 sets the first column to end at
50% of the current table width and the second column at 70% of the total
table width.
IMHO ist dies nicht optimal, da ich eine Maßeinheit bevorzugen würde.

2) Gimmick:
Hast Du evtl. noch einen Tipp, wie ich zu Beginn des Makros prüfen
lassen kann, ob die Tabelle fünf Spalten enthält.
Kleiner "Perfektionswahn" von mir. Die betreffenden Tabellen enthalten
fünf Spalten. Aber die Überprüfung wäre professioneller.

Gruß

Jochen
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Peter Eberlein
14 years ago
Permalink
...
if oTable.Columns.Count <> 5 then
msgBox "Tabelle enthält " & oTable.Columns.Count & " Spalten!", 16
exit Sub
end If

Gruß Peter
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Peter Eberlein
14 years ago
Permalink
Post by Jochen
Hallo Peter,
Ich hatte noch ein Verständnisproblem bzgl. der Spaltenbreite. Beim
The column separator specifies where the column ends as percentage of
the table width. A column end position of 5000 specifies 50% of the
table width. The macro in Listing 8.11 sets the first column to end at
50% of the current table width and the second column at 70% of the total
table width.
IMHO ist dies nicht optimal, da ich eine Maßeinheit bevorzugen würde.
Was machst Du bei "Ausrichtung Tabelle automatisch", wenn danach die
Seitenränder geändert werden? Die Tabelle pass sich ja an. Insofern kann
es keine absoluten Werte geben.

Gruß Peter
--
Informationen zum Abmelden: E-Mail an users+***@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Loading...