Tabelle durch Text ersetzen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Tabelle durch Text ersetzen

Beitrag von clag »

Hallo Sonntagsarbeiter :)

meine erste von 2 Aufgaben für den heutigen Sonntag :(

in einem Writerdokument (WWW importiert) gibt es eine oder auch mehrere Tabellen die 1 Zeile und 3 Spalten groß sind
wobei nur die mittlere Spalte Text enthält .
Diese Tabelle möchte ich komplett entfernen und durch den Text aus der mittleren Zelle im "Textkörper/Blocksatz" ersetzen.
mit folgenden Code komme ich bis zum auslesen der mittleren Zelle ........

Code: Alles auswählen

Enum = Doc.Text.createEnumeration
	While Enum.hasMoreElements
		TextElement = Enum.nextElement
			if TextElement.supportsService("com.sun.star.text.TextTable") then
				print "Tabelle gefunden "
				myTables = createunoservice("com.sun.star.text.TextTables")
				myTables = oDoc.getTextTables
				myTable = createunoservice("com.sun.star.text.TextTable")
				myTable = myTables.getByIndex(0)
				myCell = myTable.getCellByPosition(1,0)
				print myCell.string

' Tabelle entfernen
' Text einfügen

			end if
     Wend
wie kann ich nun diese Tabelle entfernen und an gleicher Stelle den ausgelesenen String als "Textkörper/Blocksatz" einfügen (der bis zu 50 Zeilen umfassen kann).

Für anwendbare Code-fetzen oder sonstige Hinweise die zum gewünschten Ziel führen wäre ich sehr erfreut
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Tabelle durch Text ersetzen

Beitrag von turtle47 »

Hi Clag,
clag hat geschrieben: wie kann ich nun diese Tabelle entfernen und an gleicher Stelle den ausgelesenen String als "Textkörper/Blocksatz" einfügen (der bis zu 50 Zeilen umfassen kann).
Vielleicht so :wink:

Code: Alles auswählen

Option Explicit
Sub Main
Dim oTable, oCurs, mytextCursor, myViewCursor, oPar, myCell as Object
Dim CellString as String
Dim oText
Dim Anzahl, i as Integer
Anzahl = ThisComponent.getTextTables().getCount
for i = 0 to Anzahl -1
	oTable = ThisComponent.getTextTables().getByIndex(0)
	myCell = oTable.getCellByPosition(1,0)
	CellString = myCell.string	
	oText = ThisComponent.getText()
	oCurs = oText.createTextCursor()
	oPar = ThisComponent.createInstance("com.sun.star.text.Paragraph")
	mytextCursor   = ThisComponent.text.createtextcursor()
	myViewCursor = ThisComponent.GetCurrentController.ViewCursor
	oText.insertTextContentBefore ( oPar, oTable)
	ThisComponent.getCurrentController().select(oTable)
	oCurs = ThisComponent.getCurrentController().getViewCursor()	
	oCurs.goLeft(1, False)
	oCurs.string = CellString
	oCurs.ParaAdjust = 3
	oTable.dispose()
	next
End Sub
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle durch Text ersetzen

Beitrag von clag »

Hallo Turtle47,

uih,...
dass sieht aber viel aufwändiger aus als ich es gedacht hätte !

und nun ist mir auch noch bei meiner Basic-Wurstelei etwas aufgefallen was die ganze Sache zumindest aus meiner Sicht erheblich kompliziert :(
ich hatte angenommen, dass die im Dokument enthaltenen Tabellen logischerweise von oben nach unten durchnummeriert sind ......
aber da hatte ich mich zu früh gefreut

jedenfalls hat es wenn ich die Tabellen mit diesem Code angesprochen habe

Code: Alles auswählen

myTable = myTables.getByIndex(0)
myCell = myTable.getCellByPosition(1,0)
den Inhalt der letztem Tabelle im Dokument gezeigt?

in einigen Dokumenten ist es so, die oberste Tabelle = Tabelle(0)
in Anderen ist die Tabelle(0) die letzte Tabelle im Dokument und die oberste ist (3)
oder auch die Mittlere ist die (0) so ein Käse :(

wie kann das sein bei Importierten WEB-Seiten ?

was macht den Enum von oben nach unten durchzählen !?

und vor allem wie geht der von dir generierte Code vor ?

werde ich gleich mal einbauen und austesten :D

schonmal ganz viel Daaaanke
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Tabelle durch Text ersetzen

Beitrag von turtle47 »

clag hat geschrieben:ich hatte angenommen, dass die im Dokument enthaltenen Tabellen logischerweise von oben nach unten durchnummeriert sind ......
Diese Annahme ist schlichtweg falsch. Das ist aber nicht nur bei Tabellen so, sondern ach noch bei anderen Objekten so.
Der Index richtet sich immer nach der Reihenfolge des einfügens. Das hat aber nichts mit der Beschriftung der Objekte zu tun!

Füge doch mal ein paar Tabellen mit Beschriftung ein, so bekommt die Erste die Beschriftung "Tabelle 1" und hat den Index 0.

Füge eine Zweite Tabelle oberhalb der zuerst eingefügten Tabelle ein, so bekommt diese jetzt die Beschriftung "Tabelle 1" und den Index 1.
Die zu erst eingefügte untere Tabelle erhält automatisch die Beschriftung "Tabelle 2".
clag hat geschrieben:was macht den Enum von oben nach unten durchzählen !?
Enum arbeitet von oben nach unten ab.

GetbyIndex arbeitet nach dem erhaltenen Index ab.
clag hat geschrieben:und vor allem wie geht der von dir generierte Code vor ?
Na, das kannst Du doch aus dem Code rauslesen. :lol:

- Das Makro spricht zuerst die Tabelle mit dem Index 0 (Null) an,
- liest den Text aus der Zelle,
- fügt einen Absatz vor der Tabelle ein,
- schreibt den Text oberhalb der Tabelle
- löscht die Tabelle mit dem Index 0 (Null)

Jetzt kommt die Kruks an der Geschichte.
Die Tabelle die vorher den Index 1 hatte, hat jetzt den Index 0 (Null) und auch die anderen Tabellen rücken im Index nach.

Das siehst Du in folgener Zeile:

Code: Alles auswählen

Table = ThisComponent.getTextTables().getByIndex(0)
Es wird immer die Tabelle mit dem Index 0 (Null) angesprochen weil der Index beim löschen der Tabellen immer nachrückt.

Ist die Verwirrung jetzt auf das Optimum gestiegen?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle durch Text ersetzen

Beitrag von clag »

Hallo Turtle47,

sieht gut aus funktioniert gut bis auf eine Kleinigkeit,
nämlich das auf Grund der mir unbekannten Reihenfolge des Tabellen Index
manchmal mit der letzten Tabelle begonnen wird, die aber in der ersten Spalte die Information enthält.
Ursprünglich wollte ich die unberührt lassen aber ich denke ich kann eine if Abfrage einbauen
die erst checked ob "Cellstring" aus Spalte 0 etwas Sinniges enthält und wenn nicht eben Spalte 1 ausliest.

aber sonst alles in Butter :D

bis auf die vielen neuen Begriffe die du da wieder eingebaut hast :o
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Tabelle durch Text ersetzen

Beitrag von turtle47 »

clag hat geschrieben: bis auf die vielen neuen Begriffe die du da wieder eingebaut hast
Die da wären?
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle durch Text ersetzen

Beitrag von clag »

Hi,

na zB..
oCurs.ParaAdjust = 3
oTable.dispose()
und so .......

aber ich werd's schon rauskriegen :lol:
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle durch Text ersetzen

Beitrag von clag »

Hallo Turtle47,

nach etwas praktischem Einsatz dieses Makrocode,
stellt sich heraus da gibt's noch'n kleines Problem

1. Textformate gehen verloren (nicht ganz so schlimm)
2. aber wenn die auszulesende Zelle noch etwas anderes enthält zB ein Bild oder einen Link,
dann wird der Zellinhaltes überhaupt nicht in den Zielbereich (neuer Absatz) übertragen,
die fokussierte Tabelle aber sehr wohl gelöscht :-o

Das ist natürlich nicht mein Ziel :wink:

ist es sehr schwierig den gesamten Zellinhalt zu übertragen ?

wenn man das von Hand macht also in der betreffenden ein Zelle Ctrl+A
und dann copy 'n' paste wird doch auch alles übertragen !

kannst du oder auch jemand anders mir bitte erklären,
wie man dieses Verhalten per Makro hin bekommt ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten