Gelöst: Dynamisch erzeugte Tabellen in Writer
Moderator: Moderatoren
Gelöst: Dynamisch erzeugte Tabellen in Writer
Hallo,
ich erzeuge dynamisch ein OpenOffice Writer Dokument, in dem - unter anderem - auch eine Tabelle erstellt wird.
Damit die Tabelle nur genau so viele Zeilen hat, wie sie in dem jeweiligen Fall benötigt, wird sie Zeile für Zeile zusammengebaut.
Dazu habe ich im Basisdokument eine Textmarke. An dieser Stelle füge ich dann per InsertDocumentFromURL eine kleine .ott Datei ein, die den Tabellenkopf und die erste Zeile jeweils mit Textmarken in den Tabellenzellen enthält.
Durch das Einfügen verschiebt sich meine Textmarke, die die Tabellenposition anzeigt, hinter die Tabelle.
Werden nun weitere Zeilen benötigt, wird jeweils wieder mit InsertDocumentFromURL eine weitere .ott Datei eingefügt, die in diesem Fall nur eine Tabellenzeile auch wieder mit den gleichen Textmarken in den Tabellenzellen enthält. Zuvor werden die bisherigen Textmarken in der Tabelle umbenannt, damit es keine Konflikte gibt.
Soweit so gut. Allerdings werden die einzelnen Tabellenteile immer mit einer Leerzeile voneinander getrennt, so dass viele kleine Tabellen entstehen.
Es sollte aber natürlich eine einzige zusammenhängende Tabelle entstehen.
Genau das Gleiche habe ich schon im Zusammenhang mit MS Word programmiert. Da war es so, dass beim Einfügen immer vor der aktuellen Cursorposition und damit auch vor der abschließenden Absatzmarke eingefügt wurde.
Bei OpenOffice scheint immer dahinter eingefügt zu werden.
Kann ich es über einen Parameter steuern, ob vor oder hinter der Cursorposition eingefügt wird?
Oder gibt es alternativ dazu eine Möglichkeit die Leerzeile zu löschen oder die Tabellenteile dazu zu bewegen, zusammen zu finden?
Ich freue mich über jeden Tipp. Auch völlig neue Ansätze sind gern willkommen.
Viele Grüße,
Petra
ich erzeuge dynamisch ein OpenOffice Writer Dokument, in dem - unter anderem - auch eine Tabelle erstellt wird.
Damit die Tabelle nur genau so viele Zeilen hat, wie sie in dem jeweiligen Fall benötigt, wird sie Zeile für Zeile zusammengebaut.
Dazu habe ich im Basisdokument eine Textmarke. An dieser Stelle füge ich dann per InsertDocumentFromURL eine kleine .ott Datei ein, die den Tabellenkopf und die erste Zeile jeweils mit Textmarken in den Tabellenzellen enthält.
Durch das Einfügen verschiebt sich meine Textmarke, die die Tabellenposition anzeigt, hinter die Tabelle.
Werden nun weitere Zeilen benötigt, wird jeweils wieder mit InsertDocumentFromURL eine weitere .ott Datei eingefügt, die in diesem Fall nur eine Tabellenzeile auch wieder mit den gleichen Textmarken in den Tabellenzellen enthält. Zuvor werden die bisherigen Textmarken in der Tabelle umbenannt, damit es keine Konflikte gibt.
Soweit so gut. Allerdings werden die einzelnen Tabellenteile immer mit einer Leerzeile voneinander getrennt, so dass viele kleine Tabellen entstehen.
Es sollte aber natürlich eine einzige zusammenhängende Tabelle entstehen.
Genau das Gleiche habe ich schon im Zusammenhang mit MS Word programmiert. Da war es so, dass beim Einfügen immer vor der aktuellen Cursorposition und damit auch vor der abschließenden Absatzmarke eingefügt wurde.
Bei OpenOffice scheint immer dahinter eingefügt zu werden.
Kann ich es über einen Parameter steuern, ob vor oder hinter der Cursorposition eingefügt wird?
Oder gibt es alternativ dazu eine Möglichkeit die Leerzeile zu löschen oder die Tabellenteile dazu zu bewegen, zusammen zu finden?
Ich freue mich über jeden Tipp. Auch völlig neue Ansätze sind gern willkommen.
Viele Grüße,
Petra
Zuletzt geändert von pdidi am Mo, 28.04.2008 18:36, insgesamt 1-mal geändert.
Re: Dynamisch erzeugte Tabellen in Writer
Hallo Petra,
mit folgendem Code, den ich von Michaels Homepage (ist zur Zeit leider offline) habe, wird die neue Tabelle direkt an die vorhergehendeTabelle angefügt.
Hilft das weiter?
Juergen
mit folgendem Code, den ich von Michaels Homepage (ist zur Zeit leider offline) habe, wird die neue Tabelle direkt an die vorhergehendeTabelle angefügt.
Code: Alles auswählen
Sub Tabelle
oDoc = thisComponent
oCursor = oDoc.Text.createTextCursor()
newTable = oDoc.createInstance("com.sun.star.text.TextTable")
newTable.initialize(3, 3) 'Anzahl Spalten und Zeilen
newTable.name="NeueTabelle"
oDoc.Text.insertTextContent(oCursor, newTable, False)
End Sub
Juergen
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
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Re: Dynamisch erzeugte Tabellen in Writer
Laut API gibt es kein Parameter dafür, es scheint immer dahinter eingefügt / oder ersetzt zu werden.
http://api.openoffice.org/docs/common/r ... extContent
Eventuell Zeile für Zeile von Hand einfügen. Ist mehr Aufwand, aber wird dann eine Tabelle sein.
Martin
http://api.openoffice.org/docs/common/r ... extContent
Eventuell Zeile für Zeile von Hand einfügen. Ist mehr Aufwand, aber wird dann eine Tabelle sein.
Martin
Re: Dynamisch erzeugte Tabellen in Writer
Hallo,
danke für die Antworten.
Geholfen haben sie zwar nicht direkt, aber mich zumindest noch auf neue Ideen gebracht.
Und darauf, dass euch noch eine Information fehlt, um mein Problem komplett zu verstehen:
Ich entwickle eine Standardschnittstelle, mit der von Lotus Notes aus (also Star Basic ähnlich) beliebige OpenOffice Writer Dokumente erzeugt und bearbeitet werden können. Dazu werden in Lotus Notes die .ott Dateien hinterlegt und beschrieben, welche Textmarke bzw. welcher Bereich der .ott mit welchem Inhalt gefüllt werden soll.
Einer dieser Inhalte kann eine Tabelle sein. In diesem Fall wird eine weitere Beschreibung herangezogen, bei der wiederum eine .ott Datei anhängt (mit einer Tabellenzeile) und auch wieder eine Festlegung, was wohin kommen soll.
Das Writer Dokument baut sich also Stück für Stück auf, so wie es gerade aufgrund der Inhalte benötigt wird.
Jetzt habe ihr mich auf folgende Idee gebracht, bei der es aber bei mir wieder an der entgültigen Umsetzung etwas hängt.
Das Erzeugen der neuen Tabelle und Initialisieren scheitert daran, dass ich nicht weiß, wieviele Spalten die Tabelle haben wird.
Das ist in diesem Fall aber auch egal, da zumindest das Einfügen über InsertDocumentFromURL in meine Basis .ott Datei prima funktioniert.
Damit habe ich also zumindest den Tabellenanfang.
Jetzt könnte ich die Zeile kopieren, damit ich die Textmarken habe.
Dann die Inhalte an die Textmarken einfügen und die Textmarken anschließend umbenennen.
Danach eine Zeile an die Tabelle anhängen und in diese Zeile den zuvor kopierten Inhalt einfügen, damit die Textmarken für die nächsten Inhalte wieder zur Verfügung stehen.
Ich habe es versucht mit folgendem Code umzusetzen (bitte nicht an der Notes-typischen Syntax mit Set usw. stören):
Zum Kopieren der letzten Tabellenzeile:
Zum Einfügen der neuen Zeile und Kopieren des zuvor gemerkten Inhalts:
Den Code zum Einfügen konnte ich allerdings noch nicht ausprobieren, da ich nicht zum Kopieren komme.
Ich habe es zum Setzen des Cursors, dort wo die vielen Fragezeichen sind, mit CreateTextCursorByRange probiert, aber das funktioniert bei CellRange offenbar nicht.
CreateCursorByCellName scheint mir aber auch nicht das richtige zu sein, da ja der ganze Bereich kopiert werden soll. (Oder habe ich den Befahl nur falsch verstanden?)
Ich habe noch mal in der API und in den Foren gesucht (diesmal zum Thema kopieren und einfügen) und ich habe mein schlaues Buch gewälzt (OpenOffice.org Basic). Aber so richtig klug bin ich daraus nicht geworden. Da wird zwar was von CopyRange geschrieben, aber der Befehl kopiert ja sofort und ich möchte mir den Inhalt erst mal merken, dann weitere Verarbeitungen durchführen und dann erst den zuvor gemerkten Inhalt einfügen.
Könnt ihr mir wieder netterweise helfen?
Viele Grüße,
Petra
danke für die Antworten.
Geholfen haben sie zwar nicht direkt, aber mich zumindest noch auf neue Ideen gebracht.
Und darauf, dass euch noch eine Information fehlt, um mein Problem komplett zu verstehen:
Ich entwickle eine Standardschnittstelle, mit der von Lotus Notes aus (also Star Basic ähnlich) beliebige OpenOffice Writer Dokumente erzeugt und bearbeitet werden können. Dazu werden in Lotus Notes die .ott Dateien hinterlegt und beschrieben, welche Textmarke bzw. welcher Bereich der .ott mit welchem Inhalt gefüllt werden soll.
Einer dieser Inhalte kann eine Tabelle sein. In diesem Fall wird eine weitere Beschreibung herangezogen, bei der wiederum eine .ott Datei anhängt (mit einer Tabellenzeile) und auch wieder eine Festlegung, was wohin kommen soll.
Das Writer Dokument baut sich also Stück für Stück auf, so wie es gerade aufgrund der Inhalte benötigt wird.
Jetzt habe ihr mich auf folgende Idee gebracht, bei der es aber bei mir wieder an der entgültigen Umsetzung etwas hängt.
Das Erzeugen der neuen Tabelle und Initialisieren scheitert daran, dass ich nicht weiß, wieviele Spalten die Tabelle haben wird.
Das ist in diesem Fall aber auch egal, da zumindest das Einfügen über InsertDocumentFromURL in meine Basis .ott Datei prima funktioniert.
Damit habe ich also zumindest den Tabellenanfang.
Jetzt könnte ich die Zeile kopieren, damit ich die Textmarken habe.
Dann die Inhalte an die Textmarken einfügen und die Textmarken anschließend umbenennen.
Danach eine Zeile an die Tabelle anhängen und in diese Zeile den zuvor kopierten Inhalt einfügen, damit die Textmarken für die nächsten Inhalte wieder zur Verfügung stehen.
Ich habe es versucht mit folgendem Code umzusetzen (bitte nicht an der Notes-typischen Syntax mit Set usw. stören):
Zum Kopieren der letzten Tabellenzeile:
Code: Alles auswählen
' Letzte Tabellenzeile kopieren, bevor die Bookmarkfelder mit Werten gefüllt werden.
If OOoObjDok.Bookmarks.HasByName ("Erste Bookmark in Tabelle") Then
Set textTableBookmark = OOoObjDok.Bookmarks.GetByName ("Erste Bookmark in Tabelle")
If Not Isempty(textTableBookmark.Anchor.textTable) Then ' Bookmark ist in einer Texttabelle (sollte in dieser Funktion immer so sein)
iAnzahlZeilen = textTableBookmark.Anchor.textTable.Rows.Count
iAnzahlSpalten = textTableBookmark.Anchor.textTable.Columns.Count
' Range auf letzte Zeile setzen (Anzahl Zeile/Spalte minus 1, da ab 0 positioniert wird)
Set textTableRowObj = textTableBookmark.Anchor.TextTable.getCellRangeByPosition(0, iAnzahlZeilen - 1, iAnzahlSpalten - 1, iAnzahlZeilen - 1)
' letzte Zeile merken
Set textTableRowCursor = textTableRowObj.CreateTextCursorByRange (textTableBookmark.Anchor) ' ??????????????????????????
Set textTableRowText = textTableRowCursor.GetText ()
End If
End If
Code: Alles auswählen
' eine Zeile einfügen
If Not Isempty(textTableBookmark.Anchor.textTable) Then ' Bookmark ist in einer Texttabelle (sollte in dieser Funktion immer so sein)
iAnzahlZeilen = textTableBookmark.Anchor.textTable.Rows.Count
End If
Call textTableBookmark.textTable.Rows.InsertByIndex (iAnzahlZeilen - 1, 1)
iAnzahlZeilen = textTableBookmark.Anchor.textTable.Rows.Count
iAnzahlSpalten = textTableBookmark.Anchor.textTable.Columns.Count
' Range auf letzte Zeile setzen (Anzahl Zeile/Spalte minus 1, da ab 0 positioniert wird)
Set textTableRowObj = textTableBookmark.Anchor.TextTable.getCellRangeByPosition(0, iAnzahlZeilen - 1, iAnzahlSpalten - 1, iAnzahlZeilen - 1)
Set textTableRowCursor = textTableRowObj.CreateTextCursorByRange (textTableBookmark.Anchor) ' ????????????????????
Call OOoObjDok.Text.InsertTextContent (textTableRowCursor, textTableRowText, False)' ?????? richtige Parameter?
Ich habe es zum Setzen des Cursors, dort wo die vielen Fragezeichen sind, mit CreateTextCursorByRange probiert, aber das funktioniert bei CellRange offenbar nicht.
CreateCursorByCellName scheint mir aber auch nicht das richtige zu sein, da ja der ganze Bereich kopiert werden soll. (Oder habe ich den Befahl nur falsch verstanden?)
Ich habe noch mal in der API und in den Foren gesucht (diesmal zum Thema kopieren und einfügen) und ich habe mein schlaues Buch gewälzt (OpenOffice.org Basic). Aber so richtig klug bin ich daraus nicht geworden. Da wird zwar was von CopyRange geschrieben, aber der Befehl kopiert ja sofort und ich möchte mir den Inhalt erst mal merken, dann weitere Verarbeitungen durchführen und dann erst den zuvor gemerkten Inhalt einfügen.
Könnt ihr mir wieder netterweise helfen?
Viele Grüße,
Petra
Re: Dynamisch erzeugte Tabellen in Writer
Hallo nochmal,
mit meinem Ansatz aus der letzten Mail bin ich noch nicht weiter gekommen, dafür aber mit dem was ich zuerst versucht habe.
Nämlich durch Einfügen/Datei (InsertDocumentFromURL) erst den Tabellenkopf und dann die Einzelzeilen aus einer andern Datei zusammenzufügen.
Mit einer Kollegin zusammen habe ich es jetzt erst mal so gelöst, dass die Absatzmarken, die die einzelnen Tabellen voneinander trennen, verborgen sind. Dazu musste aber in den Tabellenteildokumenten vor der letzten Absatzmarke (und auch vor der Bookmark ab der die nächste Einfügung stattfinden soll) auch mindestens ein Zeichen stehen.
Jetzt sieht das Dokument zumindest in der Seitenvorschau und beim Drucken so aus, als wäre eine einzige Tabelle enthalten, obwohl es viele kleine sind.
Zum Zeigen, dass es irgendwie geht, ist es erst mal OK.
Aber irgendwann muss ich es dann doch so hinbekommen, dass tatsächlich eine zusammenhängende Tabelle entsteht.
Also helft bitte eine OpenOffice Anfängerin.
Wie kann ich Inhalt kopieren, um ihn später einzufügen.
Lotus Notes stellt sich etwas bockig an, wenn ich den DispatchHelper ansprechen will.
Ich habe es über
versucht.
Wobei ich die Befehle des DispatchHelper im aufgezeichneten Makro fast schon zu aufgeräumt finde. Muss ich dem DispatchHelper nicht mitgeben, auf welchen Bereich sich die einzelnen Befehle beziehen sollen? Oder geht der immer auf den ViewCursor? Hab ich den überhaupt, wenn ich das ganze nur von außen aus steuere?
Ihr seht schon, Fragen über Fragen und ich blicke noch nicht richtig durch.
Manchmal habe ich das Gefühl, dass ich es endlich kapiert habe und dann bin ich wieder total verwirrt (so wie jetzt).
Liebe Grüße,
Petra
mit meinem Ansatz aus der letzten Mail bin ich noch nicht weiter gekommen, dafür aber mit dem was ich zuerst versucht habe.
Nämlich durch Einfügen/Datei (InsertDocumentFromURL) erst den Tabellenkopf und dann die Einzelzeilen aus einer andern Datei zusammenzufügen.
Mit einer Kollegin zusammen habe ich es jetzt erst mal so gelöst, dass die Absatzmarken, die die einzelnen Tabellen voneinander trennen, verborgen sind. Dazu musste aber in den Tabellenteildokumenten vor der letzten Absatzmarke (und auch vor der Bookmark ab der die nächste Einfügung stattfinden soll) auch mindestens ein Zeichen stehen.
Jetzt sieht das Dokument zumindest in der Seitenvorschau und beim Drucken so aus, als wäre eine einzige Tabelle enthalten, obwohl es viele kleine sind.
Zum Zeigen, dass es irgendwie geht, ist es erst mal OK.
Aber irgendwann muss ich es dann doch so hinbekommen, dass tatsächlich eine zusammenhängende Tabelle entsteht.
Also helft bitte eine OpenOffice Anfängerin.
Wie kann ich Inhalt kopieren, um ihn später einzufügen.
Lotus Notes stellt sich etwas bockig an, wenn ich den DispatchHelper ansprechen will.
Ich habe es über
Code: Alles auswählen
dispatchHepler = ServiceManagerObject.CreateUNOService ("com.sun.star.frame.DispatchHelper")
Wobei ich die Befehle des DispatchHelper im aufgezeichneten Makro fast schon zu aufgeräumt finde. Muss ich dem DispatchHelper nicht mitgeben, auf welchen Bereich sich die einzelnen Befehle beziehen sollen? Oder geht der immer auf den ViewCursor? Hab ich den überhaupt, wenn ich das ganze nur von außen aus steuere?
Ihr seht schon, Fragen über Fragen und ich blicke noch nicht richtig durch.
Manchmal habe ich das Gefühl, dass ich es endlich kapiert habe und dann bin ich wieder total verwirrt (so wie jetzt).
Liebe Grüße,
Petra
Re: Dynamisch erzeugte Tabellen in Writer
Hallöchen,
Ich bin richtig stolz auf mich!!!
Meine Tabelle wird jetzt dynamisch erzeugt und zwar ohne Ausblenden von Steuerzeichen!!!
1. Zunächst wird in meinem Writer Dokument bei einer bestimmten Bookmark zunächst aus einer kleinen .ott der Tabellenkopf mit der ersten Zeile eingefügt.
(Mit InsertDocumentFromURL)
2. Wenn noch eine Zeile benötigt wird, benenne ich alle in der Tabellenzeile enthaltenen Textfelder um, damit es keine Konflikte gibt.
(Über bookmark.SetName)
3. Dann öffne ich eine weitere .ott, die die nächste Tabellenzeile enthält, markiere die Zeile und merke sie mir (GetTransferable war der Befehl dazu!).
4. Danach positioniere ich den Cursor in meinem Hauptdokument in der Tabelle (an Hand einer Bookmark, von der ich weiß, dass sie in der Tabelle steht), gehe ans Ende, hänge dort eine Zeile an, wandere eine Zelle nach rechts und füge den zuvor gemerkten Inhalt ein.
Bei jeder weiteren Zeile wiederhole ich Schritt 2 und Schritt 4. Das war's.
Geholfen hat mir übrigens folgender Beitrag im englischen Forum: http://www.oooforum.org/forum/viewtopic ... 702#265702.
Liebe Grüße,
Petra

Meine Tabelle wird jetzt dynamisch erzeugt und zwar ohne Ausblenden von Steuerzeichen!!!
1. Zunächst wird in meinem Writer Dokument bei einer bestimmten Bookmark zunächst aus einer kleinen .ott der Tabellenkopf mit der ersten Zeile eingefügt.
(Mit InsertDocumentFromURL)
2. Wenn noch eine Zeile benötigt wird, benenne ich alle in der Tabellenzeile enthaltenen Textfelder um, damit es keine Konflikte gibt.
(Über bookmark.SetName)
3. Dann öffne ich eine weitere .ott, die die nächste Tabellenzeile enthält, markiere die Zeile und merke sie mir (GetTransferable war der Befehl dazu!).
Code: Alles auswählen
' Teilvorlage zum Lesen im Hintergrund öffnen
args1= serviceManagerObj.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args1.Name = "Hidden"
args1.Value = True
list1Args (0) = args1
sUrl = UrlPath + nameTeilvorlage
SubEObjDok=OOoObj.loadComponentFromURL (sUrl,"_blank",0,list1Args)
' Tabelle finden
SubETableObj = SubEObjDok.TextTables.getByIndex(0)
' Cursor in Tabelle setzen
SubEObjDok.CurrentController.select(SubETableObj)
' Cursor ansprechen
SubEViewCursor = SubEObjDok.CurrentController.getViewCursor()
' Tabelle markieren
SubEViewCursor.gotoEnd(True) 'bis zum Ende der aktuellen Zelle markieren
SubEViewCursor.gotoEnd(True) 'Bis zum Ende der aktuellen Tabelle markieren
' Tabelle kopieren
SubETransferable = SubEObjDok.CurrentController.getTransferable()
Code: Alles auswählen
textTableBookmark = OOoObjDok.Bookmarks.GetByName ("BookmarkName - zuvor umbenannt")
' Cursor in Tabelle setzen
OOoObjDok.CurrentController.select (textTableBookmark.Anchor.textTable)
textTableCursor = OOoObjDok.CurrentController.GetViewCursor ()
' Cursor ans Ende bewegen
textTableCursor.gotoEnd(False)
textTableCursor.gotoEnd (False)
' eine Zeile anhängen
iAnzahlZeilen = textTableBookmark.Anchor.textTable.Rows.Count
textTableBookmark.Anchor.textTable.Rows.InsertByIndex (iAnzahlZeilen, 1)
textTableCursor.GoRight (1,False)
' zuvor selektierte Tabelle einfügen
OOoObjDok.CurrentController.insertTransferable(SubETransferable)
Geholfen hat mir übrigens folgender Beitrag im englischen Forum: http://www.oooforum.org/forum/viewtopic ... 702#265702.
Liebe Grüße,
Petra
Re: Gelöst: Dynamisch erzeugte Tabellen in Writer
War in den letzten Tagen leider beschäftigt, aber ich mach das so:
Anfangs:
Set objRows = objTable.getRows() 'Die Zeilen holen
pro Eintrag
Call objRows.insertByIndex(Zeile, 1) 'Zeile einfügen
Zeile = Zeile + 1
pro Spalte
Set objCell = objTable.getCellByName(Chr(64 + Spalte) & Zeile) ' Zelle holen (wie Excel oder Calc)
objCell.String = String ' Text einfügen
Anfangs:
Set objRows = objTable.getRows() 'Die Zeilen holen
pro Eintrag
Call objRows.insertByIndex(Zeile, 1) 'Zeile einfügen
Zeile = Zeile + 1
pro Spalte
Set objCell = objTable.getCellByName(Chr(64 + Spalte) & Zeile) ' Zelle holen (wie Excel oder Calc)
objCell.String = String ' Text einfügen