Seite 1 von 3

[gelöst] Zwischenablage

Verfasst: Fr 16. Mär 2012, 12:31
von DAP
Hallo,

ich möchte gerne Daten aus der Zwischenablage per Makro mit ".uno:PasteSpecial" einfügen lassen.
Ich finde aber leider keine Möglichkeit, wie man die Einstellung für die Feldtrenner (bei mir Leerzeichen)
und die Zusammenfassung von Feldtrennern per Makro einstellen und den Dialog beenden kann.

Noch besser wäre, der Dialog wird erst gar nicht angezeigt.

Vielleicht kann mir einer von Euch helfen.

Re: Zwischenablage

Verfasst: Fr 16. Mär 2012, 16:12
von karolus
Hallo

Evtl. hilft dir dieser Beitrag

Karo

Re: Zwischenablage

Verfasst: Fr 16. Mär 2012, 17:31
von Frieder
Hallo DAP

Ich habe auf meiner Makro-Seite 3 Makros zum Umgang mit der Zwischenablage(ohne Dispacher)
Eventuell hilft dir ja das Makro Text aus Zwischenablage.

Wenn du etwas genauer schildern würdest, was du eigentlich machen willst, kann ich dir wahrscheinlich besser helfen.
In der Regel ist es besser, und einfacher, wenn du die Zwischenablage überhaupt nicht benutzt,
sondern eine andere Makro Lösung verwendest.

Gruß Frieder

Re: Zwischenablage

Verfasst: Sa 17. Mär 2012, 20:29
von DAP
Hallo,

vielen Dank für Eure Bemühungen.
ich denke der Link von Karo könnte mich schon etwas weiter bringen.
Frieder hat geschrieben: Wenn du etwas genauer schildern würdest, was du eigentlich machen willst, kann ich dir wahrscheinlich besser helfen.
In der Regel ist es besser, und einfacher, wenn du die Zwischenablage überhaupt nicht benutzt,
sondern eine andere Makro Lösung verwendest.
Ich habe Daten aus einer anderen Anwendung (leider nur über die Zwischenablage), die folgendermaßen
aussehen (kleiner Auszug):

" 4 mpm stat abst Bemerkung
0.001 1.20 2.33 KOK
0.002 3.45 1.66 KUK
0.003 5.20 2.33 2356 KOK
0.004 6.45 4.56 2356

0.001 1.20 2.33 KOK
0.002 3.45 1.66 KUK
0.003 5.20 2.33 559
0.004 6.45 4.56 456"

Die erste Zeile ist die Spaltenbeschriftung, wobei die 4 für die Anzahl der Datenreihen pro Ausgabeblock steht.

Ich dachte, ich könnte die Funktionen verwenden, die auch beim einfügen über den Dialog angeboten werden.
Z.B. die Leerzeichentrenner zusammenfassen, die Behandlung der Zahlen als englische Zahlennotation mit dem
"." statt dem "," und die Bemerkungen, die bei Leerzeichen nicht aufgesplittet werden sollen.


Gruß DAP

Re: Zwischenablage

Verfasst: Sa 17. Mär 2012, 22:33
von karolus
Hallo

Achtung Python!

Code: Alles auswählen

import uno

context = XSCRIPTCONTEXT
ctx = uno.getComponentContext()
servicemanager = ctx.ServiceManager
createUnoService = servicemanager.createInstance


def cliptext():
    oclip = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
    oConverter = createUnoService("com.sun.star.script.Converter")
    oData = oclip.getContents()
    oTypes = oData.getTransferDataFlavors()
    for elem in oTypes:
        if elem.MimeType == "text/plain;charset=utf-16" :
            stext = oData.getTransferData( elem )
            stext = oConverter.convertToSimpleType( stext, 12 )
            return '{0:s}'.format(stext.encode('utf8'))     
        

def paste_lines_to_rows(dummy=None):
    doc, sel, sheet = rangeselection()
    address = sel.getCellAddress()
    c, r = address.Column, address.Row
    liste = cliptext()
    liste = liste.splitlines()
    header = liste[0].split()
    header = header[1:]
    maxsplit = len(header) -1
    makesetarray( sheet, (tuple( header ),), c, r )
    r += 1
    for line in liste[1:]:
        if line:
            out = (tuple( line.split(' ', maxsplit )),)
            makesetarray( sheet, out, c, r )
        r += 1
   


    

def rangeselection():
    doc = context.getDocument()
    sel = doc.getCurrentSelection()
    sheet  = sel.getSpreadsheet()
    return doc , sel , sheet

def makesetarray( sheet , olist,startcol=0,startrow=0):
    endrow = len( olist ) -1 + startrow
    endcol = len( olist[0] )-1 + startcol
    oRange = sheet.getCellRangeByPosition(startcol, startrow,
                                          endcol , endrow)
    oRange.setFormulaArray( olist )
Schau dir die angehängte Datei mit eingebettetem Pythonscript an, eingefügt wird ab der aktuell selektierten Zelle.
Edit :Änderungen im Code und in der angehängten Datei 22:45
Karo

Re: Zwischenablage

Verfasst: So 18. Mär 2012, 21:00
von DAP
Hallo Karo,

ich kann die scripts in der Datei weder ausführen noch bearbeiten, wo
kann ich das einstellen? Sicherheit habe ich schon auf niedrig gestellt.

Gruß DAP

Re: Zwischenablage

Verfasst: So 18. Mär 2012, 22:16
von karolus
Hallo
zuerst musst du die Datei speichern, dann ggf. unter →Extras→Optionen→LO→Sicherheit→Makrosicherheit [x}Mittel einstellen.
Dann sollte in der geöffneten Datei→Extras→Makros→Makros ausführen→paste_special.ods→clip_to_calcrange→paste_lines_to_rows ausführbar sein ?

Alternativ kannst du auch den Quellcode aus meiner letzten Antwort editieren und speichern unter ~/3/user/Scripts/python/Name_deiner_Wahl.py . (siehe →Extras→Optionen→LO→Pfade )
Den Ordner python musst du vmtl. erst erstellen

Karo

Re: Zwischenablage

Verfasst: So 18. Mär 2012, 22:31
von DAP
Hallo Karo,

es tut mir Leid, aber ich kann weder python scripte ausführen, noch bearbeiten und auch
nicht neu erstellen. Den Pfad habe ich angelegt wie beschrieben. Die Button erstellen und
bearbeiten sind gar nicht aktivierbar. Basic Makros kann ich hingegen bearbeiten und erstellen.

Gruß DAP

Re: Zwischenablage

Verfasst: Mo 19. Mär 2012, 11:21
von karolus
Hallo

Ok, das ganze nochmal in Basic:

Code: Alles auswählen

function cliptext()
    oclip = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
    oConverter = createUnoService("com.sun.star.script.Converter")
    oData = oclip.getContents()
    oTypes = oData.getTransferDataFlavors()
    for e = 0 to ubound(oTypes)
        if oTypes(e).MimeType = "text/plain;charset=utf-16" then
            stext = oData.getTransferData( oTypes(e) )
            stext = oConverter.convertToSimpleType( stext, 12 )
            cliptext = stext
            exit function
        end if
    next
end function     
        

    

sub paste_lines_to_rows()

    doc = thisComponent
    sel = doc.getCurrentSelection()
    sheet = sel.getSpreadsheet()
    address = sel.getCellAddress()
    c  = address.Column : r = address.Row
    liste = cliptext()
    liste() = split( liste, chr(10))
    endrow = ubound(liste())
    tmp() = split( liste(0), " " , 2)
    liste(0) = split( tmp(1), " ")
    endcol = ubound(liste(0))
    for i = 1 to endrow
    	if len(liste(i)) then
    		liste(i) = split( liste(i), " ", endcol +1 )
    	else
    		liste(i) = split( space( endcol ), " ")
    	end if 
    next i
    range = sheet.getCellrangeByPosition( c, r, c + endcol, r + endrow )
    range.setFormulaArray( liste())
    
end sub
Funktioniert das?

Karo

Re: Zwischenablage

Verfasst: Mo 19. Mär 2012, 15:56
von DAP
Hallo Karo,

vielen Dank für deine Bemühungen, es funktioniert bis auf die letzte Zeile, aber die
Daten werden eingefügt, obwohl folgende Fehlermeldung kommt.

Type: com.sun.star.uno.RuntimeException
Message: .

Eine Kleinigigkeit gibt es noch, wenn aufeinander folgende Leerzeichen
auftreten, dann müssen diese als ein Trenner behandelt werden,
da sonst die Spalten durcheinander kommen.
Bei meinem Beispieldatensatz s.o. wurden die doppelten Leerzeichen leider
"wegformatiert".

Gruß DAP