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