[gelöst] Tabelle löschen und durch Text ersetzen

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

Moderator: Moderatoren

wolli-j
**
Beiträge: 33
Registriert: Fr, 06.08.2010 13:10

[gelöst] Tabelle löschen und durch Text ersetzen

Beitrag von wolli-j »

Hallo zusammen, ich habe ein Textdokument (Beispiel siehe Anhang)
AnTabelleEinfuegen.odt
(11.93 KiB) 131-mal heruntergeladen
Darin identifiziere ich die letzte Tabelle. Diese lösche ich und möchte an der Stelle einen anderen Text einfügen.

Mein Problem: Text einfügen an der richtigen Stelle.

Bis jetzt füge ich den Text am ViewCursor ein, dieser steht aber nicht notwendigerweise dort, wo die Tabelle gelöscht wurde. Ich hätte gerne eine Idee, wie ich das umsetzen kann.

(Bonusfrage: wie kann ich den einzufügenden Text aus einer anderen Datei holen [wie im Menü Einfügen - Datei]?

Dankeschön!

Code: Alles auswählen

REM  *****  BASIC  *****
option explicit

sub test

dim oDocument as object, _
	oTabelle as object, _
	intTabCount as integer, _
	oViewCursor as object
	
	oDocument = ThisComponent
	
	'letzte Tabelle im Dokument identifizieren
	intTabCount = oDocument.GetTextTables().getCount()
	if intTabCount = 0 then
		exit sub
	else
		oTabelle = oDocument.TextTables.getByIndex(intTabCount - 1)
	end if

	'ViewCursor setzen
	oViewCursor = oDocument.GetCurrentController().GetViewCursor()

	'Tabelle löschen
	oDocument.Text.removeTextContent(oTabelle)

	'Text einfügen an der Stelle des ViewCursors - der ist leider nicht bei der Tabelle!
	oDocument.GetText().insertString(oViewCursor, "hullo", False)

end sub

Zuletzt geändert von wolli-j am Fr, 18.10.2019 10:56, insgesamt 1-mal geändert.
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Tabelle löschen und durch Text ersetzen

Beitrag von Toxitom »

Hei wolli,

also, zumindest den ersten Teil kann ich Dir beantworten. Leider ist das gar nicht soooo toll - möglicherweise gibt es auch ne einfacherern Weg.

Aber funktionieren tut:

Du kannst deine Tabelle identifizieren. Die Tabelle hat immer einen Namen. Soweit so gut.

Die Position der Tabelle ist hingegen leider nicht so einfach zu finden. Per View-Cursor geht das aber. Du erzeugt den ViewCursor, positioniert ihn am Anfang des Dokumentes, und gehst dann immer eine Zeile nach unten.
Jetzt prüfst Du jedesmal, on der ViewCursor in einer Tabelle ist und ob der Name der Tabelle Deiner Wunschtabelle entspricht. Wenn ja, gehst Du wieder einen Zeile zurück - jetzt bist Du genau oberhalb der Tabelle. Dort kannst Du jetzt den beliebigen Text eingeben (und die Tabelle löschen;))

Code: Alles auswählen

dim oDocument as object, _
	oTabelle as object, _
	intTabCount as integer, _
	oViewCursor as object
	
	oDocument = ThisComponent
	
	'letzte Tabelle im Dokument identifizieren
	intTabCount = oDocument.GetTextTables().getCount()
	if intTabCount = 0 then
		exit sub
	else
		oTabelle = oDocument.TextTables.getByIndex(intTabCount - 1)
	end if
	oAnk = oTabelle.anchor.start

	'ViewCursor setzen
	oVC = oDocument.GetCurrentController().GetViewCursor()
	oVC.jumpToFirstPage()   'erste Seite
	oVC.jumpToStartOfPage() 'erstes Zeichen
    
    REM Schleife zeile für Zeile
	Do while oVC.goDown(1, false)
	  if NOT isEmpty(oVC.textTable) then  'Cursor in einer Tabelle	  
	    if oVC.textTable.name = oTabelle.Name then   'Tabelle hat den passenden Namen
	      oVC.goUp(1, false)    'wieder eine Zeile zurück
	      oVC.string = "hallo"  'was reinschreiben - steht jetzt genau vor der Tabelle
	      exit Do
	     end if
	  end if	  	 
	loop
	
	'Tabelle löschen
	'oDocument.Text.removeTextContent(oTabelle)

	'Text einfügen an der Stelle des ViewCursors - der ist leider nicht bei der Tabelle!
	'oDocument.GetText().insertString(oViewCursor, "hullo", False)

end sub
Vielleicht hilft es Dir erst einmal:)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Tabelle löschen und durch Text ersetzen

Beitrag von Stephan »

setze den Cursor vor dem Löschen der Tabelle in deren Zelle A1:

Code: Alles auswählen

dim oDocument as object, _
	oTabelle as object, _
	intTabCount as integer, _
	oViewCursor as object
	
	oDocument = ThisComponent
	
	'letzte Tabelle im Dokument identifizieren
	intTabCount = oDocument.GetTextTables().getCount()
	if intTabCount = 0 then
		exit sub
	else
		oTabelle = oDocument.TextTables.getByIndex(intTabCount - 1)
	end if
	
	'ViewCursor setzen
	oViewCursor = oDocument.GetCurrentController().GetViewCursor()
	oViewCursor.GotoRange(oTabelle.getCellByPosition(0,0), false)

	'Tabelle löschen
	oDocument.Text.removeTextContent(oTabelle)
	oDocument.Text.insertControlCharacter(oViewCursor, 0, false) 
	oViewCursor.GoLeft(1, False)

	'Text einfügen an der Stelle des ViewCursors - der ist leider nicht bei der Tabelle!
	oDocument.GetText().insertString(oViewCursor, "hullo", False)

end sub

(Bonusfrage: wie kann ich den einzufügenden Text aus einer anderen Datei holen [wie im Menü Einfügen - Datei]?
Das scheinen mir verschiedene Dinge, denn eine (ganze) Datei ist eine ganze Datei und ein Text in einer Datei nur ein Stück davon. Angenommen es ginge darum das in einer Datei nur ein simples Stück Text ist das insgesamt benutzt werden soll, dann z.B. so:

Code: Alles auswählen

Dim arr(0) As New com.sun.star.beans.PropertyValue

arr(0).Name = "Hidden"
arr(0).Value = True

datei = ConvertToURL("D:\Test.odt")
akt_doc = StarDesktop.loadComponentFromUrl(datei, "_blank", 0, arr())
DerText = akt_doc.Text.String
akt_doc.Close(True)
Msgbox DerText
Ansonsten musst Du erklären wo der Text in der Datei steht, meinethalben in einem Bereich oder in einer Tabellenzelle etc.


Gruß
Stephan
wolli-j
**
Beiträge: 33
Registriert: Fr, 06.08.2010 13:10

Re: Tabelle löschen und durch Text ersetzen

Beitrag von wolli-j »

Guten Morgen! Vielen Dank für die Hilfe. Ich habe Stephans Lösung als Grundlage genommen und füge die andere Datei (die wiederum eine Tabelle enthält) per Dispatcher an der nunmehr richtigen Stelle ein - das funktioniert. Für die Entwicklung bin ich übrigens in LibreOffice gesprungen, da AOO mir in der IDE dauernd abschmiert. Laufen tut's freilich auch in AOO 8)

Code: Alles auswählen

dim oDocument as  object, _
	oTabelle as object, _
	intTabCount as integer, _
	oViewCursor as object, _
	oDocFrame   as object, _
	oDispatcher as object, _
	args(1) as new com.sun.star.beans.PropertyValue
	
	oDocument = ThisComponent
	oDocFrame = oDocument.CurrentController.Frame

	'letzte Tabelle im Dokument identifizieren
	intTabCount = oDocument.GetTextTables().getCount()
	if intTabCount = 0 then
		exit sub
	else
		oTabelle = oDocument.TextTables.getByIndex(intTabCount - 1)
	end if

	'ViewCursor setzen
	oViewCursor = oDocument.GetCurrentController().GetViewCursor()
	oViewCursor.GotoRange(oTabelle.getCellByPosition(0,0), false)
	
	'Tabelle löschen
	oDocument.Text.removeTextContent(oTabelle)

	'Dispatcher vorbereiten
	oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	args(0).Name = "Name"
	args(0).Value = ConvertToURL("C:\NTB\oo\einftab.odt")
	args(1).Name = "Filter"
	args(1).Value = "writer8"

	'Datei einfügen - diese enthält nur eine Tabelle (und die obligatorische Absatzmarke dahinter)
	oDispatcher.executeDispatch(oDocFrame, ".uno:InsertDoc", "", 0, args())

	'wiederum die letzte Tabelle im Dokument identifizieren
	intTabCount = oDocument.GetTextTables().getCount()
	if intTabCount = 0 then
		exit sub
	Else
		oTabelle = oDocument.TextTables.getByIndex(intTabCount - 1)
	end if

	'die Absatzmarke vor der Tabelle löschen
 	oDocument.Text.removeTextContentBefore(oTabelle)
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: [gelöst] Tabelle löschen und durch Text ersetzen

Beitrag von Toxitom »

Hei Wolli,
.. und füge die andere Datei (die wiederum eine Tabelle enthält) per Dispatcher an der nunmehr richtigen Stelle ein...
Hmm, Tabelle löschen? Neue Tabelle an der Stelle einfügen?? Wäre es vielleicht nicht einfacher gewesen, lediglich die Zellinhalte zu löschen und aus der anderen Datei die Zellinhalte als Array auszulesen und dann in die aktuelle Tabelle einzubringen? Eventuell vorher die Dimensionen anzupassen?

Aber egal - wenn es läuft, sehr gut.

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
wolli-j
**
Beiträge: 33
Registriert: Fr, 06.08.2010 13:10

Re: [gelöst] Tabelle löschen und durch Text ersetzen

Beitrag von wolli-j »

Naja, natürlich nicht egal ... Es hat den Grund, dass ich eine Reihe von Unterschriftszeilen in Tabellenform zur Auswahl habe. für jeweils mehrere Unterschriften nebeneinander mit den Unterzeichner-Namen in der zweiten Zeile. Die Breite der Tabellenzellen ist genau austariert, so dass ich die Unterschriftsgrafiken in einem anderen Schritt dort hineinladen kann. Daher muss ich schon die ganze Tabelle importieren.

Aber danke der Nachfrage!
Antworten