Seite 1 von 1
Datei an einer Textmarke einfügen
Verfasst: Do, 29.12.2005 19:34
von ztree
Hallo,
wie kann ich in Writer an einer Textmarke eine Datei einfügen?
Danke für die Hilfe...
Verfasst: Fr, 30.12.2005 08:27
von Toxitom
so, wie einen normalen Text auch
PS: Du siehst, zu kurze Fragen ohne Informationen werden auch nicht inhaltsvoll beantwortet. Wie auch? Und die Motivation dazu fehlt dann auch.
Stelle deine Frage mit entsprechenden Inhalten, ausführlich, so dass sich jeder etwas darunter vorstellen kann, nutze Ansprache und Grussformeln, dann wird dir ebenso geholfen, wie all den anderen hier im Forum.
Verfasst: Sa, 31.12.2005 08:01
von ztree
Hallo Toxitom,
na da habe ich mich ja gleich unbeliebt gemacht , was nicht meine Absicht war...
Ich versuche es daher nochmal etwas detaillierter:
Es geht darum, in einem Dokument alle vorhandenen Textmarken mit den Texten einer übergebenen CSV-Textdatei zu ersetzen.
In der CSV-Textdatei sind die Namen der Textmarken und der einzufügende Text durch ";" getrennt enthalten.
Einige der Textmarken werden dabei durch HTML-Blöcke ersetzt und müssen über "Datei|Einfügen" eingelesen werden, da sonst der HTML-Quelltext
eingefügt würde.
Der unten stehende Code funktioniert auch, solange sich die zu ersetzende Textmarke nicht in einem Rahmen befindet.
Wenn ich eine Textmarke (welche sich innerhalb eines Rahmens befindet) ersetzen möchte, erhalte ich eine unqualifizierte Exception.
REM ##### Alle Bookmarks ermitteln und ersetzen
' ----- die Zwischendatei für Html-Blöcke (hier legt GetCSVKeyNameData... die einzufügenden HTML-Blöcke ab)
TempHtmlFile = LocalTempPath & "temp.html"
TempHtmlFile = ConvertToUrl(TempHtmlFile)
ObjTextmarken = ObjDoc.getBookmarks()
ObjCursor = ObjDoc.Text.createTextCursor()
For Count = 0 To ObjTextmarken.getCount() - 1
ObjTextmarke = ObjTextmarken.getByIndex(Count)
KeyName = ObjTextmarke.Name
'MsgBox(KeyName)
TempString = GetCSVKeyNameData(csvData(), KeyName, TempHtmlFile)
If TempString <> "" Then
KeyValueArray() = Split(TempString, ";")
ObjCursor = ObjDoc.Text.createTextCursorByRange(ObjTextmarke.getAnchor)
If KeyValueArray(1) <> "{" Then 'normale Daten ({ ist die Kennung für HTML einfügen)
ObjCursor.String = KeyValueArray(1) 'Textmarke ersetzen
Else 'Html
ObjCursor.InsertDocumentFromURL(TempHtmlFile, Args()) 'Datei einfügen
EndIf
EndIf
Next
REM #####
Ich vermute, dass die Zeile "ObjCursor = ObjDoc.Text.createTextCursorByRange(ObjTextmarke.getAnchor)"
keine gute Idee ist, aber als Newcomer bin ich mit der OOoBasic-UNO-API noch nicht so vertraut und hoffe es kann
mir jemand helfen.
Grüße und einen guten Rutsch in's neue Jahr
Verfasst: Sa, 31.12.2005 11:04
von Toxitom
Hey ztree,
na, das sieht doch schon gleich viel "angenehmer" aus
und informativer!
Ich vermute, dass die Zeile "ObjCursor = ObjDoc.Text.createTextCursorByRange(ObjTextmarke.getAnchor)"
Die Vermutung ist zumindest nicht ganz falsch. Solange sich die Textmarken im Textkörper (Objekt "text" ) befinden, funktioniert deine Methode.
Im Körper selbst befinden sich dann aber noch alle anderen Objekte - wie Tabellen, Grafiken ud eben auch - Textrahmen. Zwar können Textrahmen auch Texte aufnehmen (und funktionieren dann ähnlich wie der Textkörper selbst), nur muss dann eben auch der Textcursor als Objekt des Textrahmens erzeugt werden, nicht des Textkörpers.
Das verkompliziert deinen Code dann erheblich, da du quasi jede Textmarke erst abprüfen musst, ob sie in Textrahmen oer im Textkörper "steckt" und dann entsprechend den Cursor erzeugen.
So würdest du den Textrahmen eines Dokumentes mit Namen "Rahmen1" zum Beispiel erhalten durch:
Code: Alles auswählen
oDoc = thisComponent
oFrame = oDoc.getTextFrames().getByName("Rahmen1")
und dort könntest du jetzt den Cursor erstellen:
Natürlich kannst du dort auch deine Textcursor erzeugen mit Ankerpunkt etc.
Dann kannst du auch den Text dort ersetzen bzw. hineinschreiben.
Wie gesagt, die Unterscheidung ist wesentlich. Vielleicht vergibst du einfach verschieden Textmarken-Namen wie "FText_1" für den Fliesstext und "RText_1" für die Marken in Rahmenobjekten, dann kannst du später durch Stringvergleiche Verzweigungen einbauen und dennoch mit Schleifen arbeiten.
Viele Grüße und eine "guten Rutsch"
Thomas
Verfasst: Sa, 31.12.2005 12:42
von ztree
Hallo Thomas,
danke für deine Erklärungen, jetzt verstehe ich die den Zusammenhang mit der Exception, wenn sich die Textmarke in einem Rahmen befindet.
Leider habe ich keinen Einfluss auf die Positionierung der Textmarken innerhalb des Dokumentes, ich muss daher bei jeder Textmarke prüfen,
ob sich diese in einem Textrahmen befindet.
Kannst du mir da nochmal helfen?
Leider finde ich keinen Hinweis auf diesen Job in den Büchern:
"OpenOffice-Programmierung von Rene Martin" und "Makros in OpenOffice.org 2.0" von Thomas Krumbein.
Zum Hintergrund für meinen Einstieg in OOo-Basic:
Ich portiere gerade ein Projekt mit automatischer Dokument-Erstellung von "Windows und MS-Office" (COM-Objects)
nach "Windows mit OpenOffice.org" und "Linux mit OpenOffice.org"
Danke!
Gruß Oli
Verfasst: Sa, 31.12.2005 13:34
von Toxitom
Hey Oli,
na ja, wenn du schon mein Buch hast ... da gibt es schon ausreichend Hinweise drin - ok, exakt das Problem ist natürlich nicht beschrieben
muss daher bei jeder Textmarke prüfen,
ob sich diese in einem Textrahmen befindet.
Na gut: Alle Textmarken erhält du über getBookmarks(), dann kannst du die einzelne entweder über den Namen oder über den Index ansprechen.
Zur Unterscheidung, wo sie sich befinden: Das ist deutlich komplizierter. Die Textmarke besitzt ein Anker-Objekt, welches die Position ihrerselbst darstellt - wenn vorhanden!
Also kannst du das abprüfen. Hier ein kurzes Beispiel: Du besitzt ein Textdokument mit Fliesstext und irgendwo der Textmarke "tm1" sowie einem Rahmen ("Rahmen1") mit Text und der Textmarke "tm2".
Jetzt kannst du das wie folgt prüfen:
Code: Alles auswählen
Sub Main
oDoc = thisComponent
oTxtMarke = oDoc.getBookmarks().getByName("tm2")
oAnker = oTxtMarke.getAnchor()
var = oAnker.textFrame
if isObject(var) then
msgbox "ja"
msgbox var.name
else
msgbox "nein"
end if
End Sub
Ändere mal den GetByName() auf "tm1" um den Unterschied zu sehen.
Das Ankerobjekt besitzt eine Eigenschaft "textFrame" (als UNO-Objekt) wenn ersich in einem solchen befindet. Ansosnten gibt es diese Objekt nicht und die Eigenschaft liefert "void", welches kein UNO-Objekt darstellt.
Danach kannst du prüfen. Ist das Objekt vorhanden, handelt es sich auch gleich um den gesuchten Rahmen (das Rahmen-Objekt) - kannst du über die Namen-Eigenschaft auslesen.
So haben die Textmarken übrigens auch Tabellen- und ähnliche Eigenschaften, wenn dort plaziert. Wie gesagt, wenn es sich "nur" um Rahmen handelt, reicht an sich die obrige Abfrage.
Noch komplizierter wird es natürlich bei verschachtelten Rahmen etc.
Ich hoffe, es hilft erst einmal.
Viele Grüße
Thomas
Verfasst: So, 01.01.2006 07:38
von ztree
Hallo Thomas,
Prost Neujahr!
Dein Buch? Potzblitz!
Ohne dein Buch wäre ich nicht so weit gekommen, es hat mir sehr geholfen und ich kann es empfehlen. Es ist klar, dass nicht jedes spezifische Problem direkt als Programmzeile zu finden ist.
Mit der OOo-API komme ich (noch) nicht zurecht und muss daher viel ausprobieren. Leider ist das Aufzeichnen von Makros keine große Hilfe, da der generierte Code nicht tief genug erstellt wird. Zum Beispiel, wenn man verhindern will, dass in einem Dokument, innerhalb von Tabellen ein Seitenumbruch erfolgt. Aber mit einer abgewandelten Version von "Sub LesezeilenEntfernen" (Seite 319) und ein wenig Ausprobieren kommt man schon dahinter.
Jetzt zum Thema "Textmarken innerhalb von Rahmen".
Danke für deine schnelle Hilfe, es ist mir jetzt klar, was ich ändern muss.
Zum Glück benötige ich nur eine Ebene und keine verschachtelten Rahmen.
Schöne Grüße
Oli