Template Speicherort in Macro nutzen

Ich habe einen separaten Template-Ordner, der von mehreren Nutzenden verwendet wird und aus dem heraus Dokumente erstellt und automatisch gespeichert werden sollen. Ich würde gern ein Speicher-Macro schreiben, welches den Pfad der Templates nutzt, um relativ dazu Dokumente beim Öffnen von Templates abzuspeichern. Der relative Pfad soll genutzt werden, damit das macro auf verschiedenen PCs funktioniert.

Also das Template liegt in /path/to/template.ott und das darauf basierende Dokument soll in ../Ziel/Dokument.odt abgespeichert werden.

Das Schreiben der Speicherfunktion beim Öffnen bereitet mir keine Probleme, nur bin ich nicht fündig geworden, wie ich an den oben beschrieben Pfad ran komme. Ich schreibe das macro in python.

Version: 7.4.5.1 / LibreOffice Community
Build ID: 40(Build:1)
CPU threads: 8; OS: Linux 6.2; UI render: default; VCL: gtk3
Locale: de-DE (en_US.UTF-8); UI: en-US
7.4.5-1
Calc: threaded

Hallo

import uno
from pathlib import Path
def test(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    template_path = uno.fileUrlToSystemPath( doc.StringValue )
    p = Path(template_path)
    ziel_path = p.parent.parent / "ziel" / "xyz.ods"
    # oder  ziel_path = p.parents[1]  / "ziel" / "xyz.ods"
    ziel_uri = ziel_path.as_uri()
    doc.storeAsURL(ziel_uri, (),)

Nochmal in Prosa:
Die URL der eigenen Dokumentvorlage, steckt…(solange das Dokument nicht gespeichert wurde)… in …StringValue.
Das wandelst du dann in einen System-pfad um, hangelst dich von dort bsplw. zum »GrossEltern-Verzeichnis« hoch und hängst den gewünschten relativen Ziel-pfad dran.
zum Schluss zurückwandeln in eine URL und doc.storeAsURL( … ,(),)

die Dokumentation https://docs.python.org/3/library/pathlib.html#module-pathlib

@LibreOfficiant: above translated by deepl:
Again in prose:
The URL of the own document template, is…(as long as the document was not saved)… in …StringValue.
Then you convert this into a system path, shimmy up from there to e.g. the “Grand-Parent-folder” and append the desired relative target path to it.
finally convert back to a URL and doc.storeAsURL( … ,(),)

1 Like

Perfekt – danke dir!

import uno
from msgbox import MsgBox

def templates_location():
    ctx = XSCRIPTCONTEXT.getComponentContext()
    smgr = ctx.getServiceManager()
    ps = smgr.createInstanceWithContext("com.sun.star.util.PathSettings", ctx)
    _display(ps.Template.replace(";","\n"),"Templates")
    return ps.Template

def _display(prompt='', title=''):
    mb = MsgBox(uno.getComponentContext())
    mb.addButton('Ok')
    mb.renderFromBoxSize(300)
    mb.show(prompt,0,title)
1 Like

Danke für den Vorschlag. Das funktioniert in meinem Fall nur bedingt, da davon auszugehen ist, dass bei manchen Nutzenden der Ordner in dem die Templates liegen, nicht unbedingt als Template-Pfad eingestellt sind. Daher würde ich gerne den Pfad des Template-Speicherorts erfassen, ohne auf PathSettings zurückzugreifen.