Zellinhalt komplett in Absatz kopieren (gelöst)

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

Moderator: Moderatoren

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

Zellinhalt komplett in Absatz kopieren (gelöst)

Beitrag von clag »

Hallo Kenner, Könner und Gernhelfer :D

wie kann man in einem Writer Dokument den kompletten Inhalt einer TabellenZelle kopieren und in gleicher Form als neuen Absatz einfügen?
Turtle47 hatte mir hier schon einmal gezeigt wie das mit reinem Text machbar ist.
Die Zellen enthalten aber immer wieder auch andere Elemente zB Links und Bilder, dann funktioniert die Methode wie sie Turtel47 anwendet leider nicht und der Inhalt wird nicht oder nur teilweise in den neuen Absatz kopiert.

Mit welcher/n Methoden bekommt man den gesamten Zellinhalt (Text, Grafik, Links, Formate) in einen Absatz kopiert ?

Das ich über jede helfende Info und/oder Lösungsansatz erfreut bin ist doch klar,
dafür gibt es dann wieder eine Einladung in meine Dankbar :lol:

Turtle47 scheint wohl auf Urlaub oder ist er etwa Krank?
für den Fall wünsche ich gute Besserung !
Zuletzt geändert von clag am Mi, 22.09.2010 05:15, insgesamt 1-mal geändert.
LG
clag

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

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hallo Kenner und Könner,

nach etlichen such und try and error Orgien habe ich es geschafft hiermit:

Code: Alles auswählen

  oTable = ThisComponent.getTextTables().getByIndex(0)
  myCell = oTable.getCellByPosition(1,0)
  oCurs = ThisComponent.getCurrentController().getViewCursor()
  ThisComponent.getCurrentController().select(mycell)
  oCurs.gotoEnd(true) 

Dim null As Object
Dim sClipName As String
Dim oClip, oDataTransfer, oClipOwner, oDocCont

oClipOwner = Null
oDocCont = thisComponent.getCurrentController()
oDataTransfer = oDocCont.getTransferable()
sClipName = "com.sun.star.datatransfer.clipboard.SystemClipboard"
oClip = createUNOService(sClipName)
oClip.setContents(oDatatransfer,Null)
den Inhalt der Zelle in die Zwischenablage zu befördern !

aber ich komme jetzt nicht mehr weiter

der Cursor müsste nun noch über der Tabelle in einen neuen Absatz versetzt werden
und da hinein dann den Inhalt der Zwischenablage kopieren

also eigentlich fehlt nur noch das "paste " bzw "shift+einfügen" aber eben in Basic

kann mir da jemand weiter helfen pleeeeease !
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von komma4 »

Wenn Du mal die SUCHFUNKTION benutzen würdest... gettransferable


Mannomann
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von Karolus »

Hallo
Warum würgst du da die Zwischenablage ? - nimm doch einfach ocell.getstring() - oder übersehe ich da irgendetwas ?

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hi ihr beiden,

wenn ihr wüsstet wie viel Liter Kaffee und wieviel Haare (von denen ich sowieso nur noch wenige habe) mich das schon gekostet hat,
würdet ihr nicht so motzen, dass hoffe ich jedenfalls. :roll:
Über diesen beschi.... Teil brüte ich seit zwei Tagen und raufe mir die wenigen Haare,

Wenn man weiß wonach man sucht mag es schon etwas einfacher sein, dazu muss man das aber erst ein mal wissen !
eine gescheiter Tipp/Codezeile erspart ein paar Tage Nerverei

gettransferable mag der Ansatz sein

ocell.getstring() kann wohl nur mit "String" umgehen ?

ich möchte aber gemischten Inhalt bewegen "Text, Bild,Links, Formate"
über die normale Writer Bedienung ja kein Problem ctrl+einfügen / shift+einfügen fertig

oder kann man da was bessers einsetzen/machen der Code den ich da gezeigt habe ist ja nicht von mir
und verstehen tu ich das auch noch nicht wirklich :(
LG
clag

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

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hi,

die Suchfunktion mit "gettransferable" gefüttert

bringt praktisch nichts was ich verwerten könnte die Dannehöfer-Seite kennt es nicht
die Oracel Starbasic Dokumentaton auch nicht und im WEB einiges einiges aber immer nur "get"
aber das funktioniert hier schon. ich brauch ja ein insert oder so etwas.

Wäre toll wenn sich jemand erbarmen könnte und mir da ganz konkret zeigt,
wie ich den Clipboard-Inhalt vor der Tabelle wieder einfüge !?

Halleluja
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von DPunch »

Aloha

Code: Alles auswählen

oTable.dispose
oCurs.goLeft(1,False)
oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
oDoc = ThisComponent.CurrentController.Frame
oDispatch.executeDispatch(oDoc, ".uno:Paste", "", 0, Array())
hintendran
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hallo DPunch,

Danke das du dich meiner Sorgen annimmst :D

habe natürlich gleich probiert ob ich damit klarkomme
zuerst hat s denn oDispatch angemeckert habe noch mit "Dim oDispath as Object" deklariert !?

und Tä tähh... alles super.. da ist der Inhalt ..............

damit hast du mir das WE gerettet, also das gibt ein ganz fettes Danke :D

dieser "Dispatcher Code" bzw ähnlicher ist mir vorher bei meine Suche nach Clipboard auch schon unter gekommen,
das habe ich aber nie dazu bewegen können Aktion zu zeigen hmm.

Der Einfügeteil von dir sieht irgendwie ganz elegant aus
könnte man so nun auch das einlesen in das Clipboard realisieren ?
brauche ich dazu nur das Paste in copy oder cut wechseln ?

na werde ich gleich noch testen und bericheten
LG
clag

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

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hi,

habe dieses versucht

Code: Alles auswählen

  oTable = ThisComponent.getTextTables().getByIndex(0)
  myCell = oTable.getCellByPosition(1,0)
  oCurs = ThisComponent.getCurrentController().getViewCursor()
  ThisComponent.getCurrentController().select(mycell)
  oCurs.gotoEnd(true)

oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
oDoc = ThisComponent.CurrentController.Frame
oDispatch.executeDispatch(oDoc, ".uno:Copy", "", 0, Array())

oTable.dispose
oCurs.goLeft(1,False)
oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
oDoc = ThisComponent.CurrentController.Frame
oDispatch.executeDispatch(oDoc, ".uno:Paste", "", 0, Array())
das fügt aber nur die drei Zeilen "CopyCode" die ich ersatzweise eingesetzt habe, als Text in das Dokument ein :lol:
nee so meinte ich das natürlich nicht was fehlt noch oder geht das so überhaupt nicht ?
LG
clag

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

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von turtle47 »

Hi Clag,
clag hat geschrieben:Turtle47 scheint wohl auf Urlaub oder ist er etwa Krank?
Nee, aber bin im Augenblick beruflich mit einem grösseren Projekt voll ausgelastet.
clag hat geschrieben:nee so meinte ich das natürlich nicht was fehlt noch oder geht das so überhaupt nicht ?
Was meintest Du so nicht? :roll:

Wenn es nur noch um die Bilder geht dann verankere die Bilder als Zeichen dann kann man diese auch kopieren und wieder in dem neuen Absatz einfügen: :lol:

Code: Alles auswählen

Sub Main
    oDocument = thisComponent
    page = oDocument.drawPage    
    nNumShapes = Page.getCount()
    For i = 0 To nNumShapes - 1
    oShape = Page.getByIndex( i )
    oShape.AnchorType = 1
    next i
    oTable = ThisComponent.getTextTables().getByIndex(0)
    myCell = oTable.getCellByPosition(1,0)
    oCurs = ThisComponent.getCurrentController().getViewCursor()
    thisComponent.getCurrentController().select(mycell)
    oCurs.gotoEnd(true)
    oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
    oDoc = ThisComponent.CurrentController.Frame
    oDispatch.executeDispatch(oDoc, ".uno:Copy", "", 0, Array())
    oTable.dispose
    oCurs.goLeft(1,False)
    oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
    oDoc = ThisComponent.CurrentController.Frame
    oDispatch.executeDispatch(oDoc, ".uno:Paste", "", 0, Array())
End Sub
Vielleicht hilft es ja weiter oder ging das am Thema vorbei? :roll:

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: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Moin Leutz, Moin Turtle47,

ist schon merkwürdig mit dem copy teil aus deinem letzten Beispiel hat das copy auf Anhieb funktioniert !?
obwohl ich auch bei genauester Betrachtung keinen Unterschied zu meinem Codeteil ausmachen konnte .........
möglicherweise gab es da ein Problem mit der Zwischenablage ich weiß jetzt nur nicht genau ob mit meiner oder der von Windows :lol:

An sich, funktioniert das "copy 'n' paste" mit dem Tabellen Inhalt so wie gewünscht, was aber noch fehlt ist, ist das einfügen eines neuen Absatzes vor dem einfügen des Inhaltes aus der Zwischenablage,
denn das "oTable.dispose" entfernt auch den Absatz in dem die Tabelle stand.
Daran, nämlich einen neuen Absatz einfügen, scheitere ich gerade wieder ziemlich grandios :(

In der Version für TextString hattest du das wohl mit "oText.insertTextContentBefore ( oPar, oTable)" gelöst !?
in einem anderen Makro hatte ich schon einmal hiermit "otext.insertControlCharacter(ocursor, 5,false) ' einen neuen Absatz" Erfolg
aber funktioniert hier auch nicht. ...... %#&-%&"& grmph
Wäre toll wenn du mir hier noch wieder auf die Sprünge helfen könntest. Bütte :)

Aber das ist noch nicht alles wo ich drüber brüte !? (ich möchte ja nicht, dass da bei jemandem lange Weile aufkommt ) pfeif :-P
In dem Dokumenten gibt immer eine bis mehrere Tabellen. Die letzte Tabelle in dem Dokument soll aber anders behandelt werden wie vorherigen (anderes Format und Text austauschen).
Da ich aber weder den Index oder den Namen der Tabelle kenne, kann ich die auch nicht direkt ansprechen und muss deshalb habe ich mit einem "if" den Zellen,String auf den Inhalt prüfen (der ist Bekannt) und ggf wechseln,
dass habe ich aber leider auch noch nicht richtig im Griff

Da ist mir jetzt die Idee gekommen es mit "Enum" zu versuchen, da wird von oben nach unten durch gezählt, somit sollte das letzte Element eigentlich auch immer die letzte Tabelle im Dokument sein !?

Code: Alles auswählen

sub test4_table

' läd die Bibliothek für das "XrayTools"
    If NOT Globalscope.BasicLibraries.isLibraryLoaded("XrayTool") Then
        GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
    End If

    Doc = thisComponent
    Enum = Doc.Text.createEnumeration
    Doc = ThisComponent
    Enum = Doc.Text.createEnumeration
'    Schleife über alle Absätze
        While Enum.hasMoreElements
            TextElement = Enum.nextElement
            if hasunointerfaces(TextElement,"com.sun.star.text.XTextTable")= true then
            print " dieses ""TextElememt"" ist eine Tabelle " 
'xray TextElement
            print TextElement.name
'  und nu ? 
' 1. wie vor dieser Tabelle einen neuen Absatz  "chr(13)" einfügen
' 2. wie den Inhalt der Zelle getby.Index(1,0) ansprechen, damit mit 3. der Inhalt aus B1 in die Zwischwnablage kommt
' 3.
    oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
    oDoc = ThisComponent.CurrentController.Frame
    oDispatch.executeDispatch(oDoc, ".uno:Copy", "", 0, Array())
.............
wend

so werden die Tabellen jetzt schön der Reihe nach angesprochen und angezeigt, soweit ist das glaube ich der besserer Weg.
Ich hatte dann noch gedacht, es ist möglicherweise besser/schneller wenn man die Schleife mehrfach aufruft und immer nur eine Aktion durch führt
1. Durchlauf nur neue Absätze einfügen Formate setzen
2. Durchlauf nur Zelleinhalt ansprechen/Formate setzen
3. Durchlauf copy 'n' paste
4. oTable.dispose gebyindex(0)


schönen Sonntag und Danke fürs lesen und so ............... :D
LG
clag

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

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von turtle47 »

clag hat geschrieben:was aber noch fehlt ist, ist das einfügen eines neuen Absatzes vor dem einfügen des Inhaltes aus der Zwischenablage,
Und warum tust Du es dann nicht :?:

Code: Alles auswählen

    '......
    oDispatch.executeDispatch(oDoc, ".uno:Copy", "", 0, Array())
    oCurs.gotoStart(True)
    oCurs.goleft(1,False)    
    oTable.dispose
    oDocument.Text.insertControlCharacter(oCurs,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false)
    oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
    oDoc = ThisComponent.CurrentController.Frame
    oDispatch.executeDispatch(oDoc, ".uno:Paste", "", 0, Array())
End Sub
clag hat geschrieben:Ich hatte dann noch gedacht, es ist möglicherweise besser/schneller wenn man die Schleife mehrfach aufruft und immer nur eine Aktion durch führt
1. Durchlauf nur neue Absätze einfügen Formate setzen
2. Durchlauf nur Zelleinhalt ansprechen/Formate setzen
3. Durchlauf copy 'n' paste
4. oTable.dispose gebyindex(0)
Warum so umständlich:

Code: Alles auswählen

Sub Main
    Doc = thisComponent
    oTable = ThisComponent.getTextTables()
    Anzahl = ThisComponent.getTextTables().Count
    c = 0 
    Enum = Doc.Text.createEnumeration
    oc = ThisComponent
        Enum = Doc.Text.createEnumeration
        While Enum.hasMoreElements
        TextElement = Enum.nextElement
        if hasunointerfaces(TextElement,"com.sun.star.text.XTextTable")= true then
            c = c + 1    
        if c = Anzahl then
            print "Letzte Tabelle gefunden: " & TextElement.name
            'mach mit der letzten Tabelle  was du möchtest
        else
            print TextElement.name
            'mach mit den anderen Tabellen  was du möchtest
        End if
        wend
    wend
End Sub
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: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hallo Turtle47,

Danke für die schnelle Antwort

den ersten CodeTeil deiner Antwort habe ich bereits eingebaut und ausprobiert,
nachdem ich noch mit "Dim oDocument as Object" angemeldet habe
bleibt das Makro aber immer noch bei
"oDocument.Text.insertControlCharacter(oCurs,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, false)"
stehen und meldet jetzt Variable nicht belegt ?

was müsste ich dem "oDocument = ?? " denn vorher noch zuweisen ?
LG
clag

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

Re: Zellinhalt komplett in Absatz kopieren

Beitrag von turtle47 »

Hi,
clag hat geschrieben: was müsste ich dem "oDocument = ?? " denn vorher noch zuweisen ?
Vieleicht das:

Code: Alles auswählen

oDocument = thisComponent
8)

Räume den Code mal auf.
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: Zellinhalt komplett in Absatz kopieren

Beitrag von clag »

Hallo Turtle47,

wie recht du hast :D

mit = "thisComponet" sieht das gut aus,
........... da kann ich jetzt weiter frickeln

und vor allem mit der Empfehlung Aufräumen !
(das sagt mir aber auch, du hast noch nicht vergessen wie hart der Anfang sein kann)

zwischen den ganzen auskommentierten grauen nicht funktionierenden Code und Anmerkungen Textzeilen
finde ich kaum noch diesen grünen Text wieder, wofür war der doch gleich noch gut :lol:

erster Teil funktioniert

mal schauen ob ich den zweiten Teil deiner Antwort die geänderte "EnumSchleife" ohne Nachfrage
so umsetzen kann, dass hier etwas oder besser das Erwartete geschieht :)

so und nochmal Danke für deine Geduld !
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten