🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

(gelöst) Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Alles zur Programmierung im LibreOffice.
Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

(gelöst) Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von Freischreiber » Fr 11. Aug 2023, 12:03

Hallo!

Der Betreff sagt fast alles: Ich möchte dem (schon vorhandenen) Dateinamen der geöffneten LO-Datei ein Datum voranstellen und nach Ausführung des Makros einfach unter dem neuen Dateinamen weiterarbeiten. Möglichst für Writer- und Calc-Dateien, universell.

Bisher habe ich das hier, zum Teil zusammengeklaut aus anderen Forumsbeiträgen:

Code: Alles auswählen

Sub DatumzuDateiname
	GlobalScope.BasicLibraries.LoadLibrary("Tools")
	dim oDoc as Object, msg1 as string, msg2 as string
	dim n as integer, sPfad as string, sURL as string, sDateiname as string, sNeuname as string, sDatum as string, sDatumneu as string
'	Dim mFileProperties(0) As New com.sun.star.beans.PropertyValue
	dim dummy()

	msg1 = "Sorry, das Dokument hat noch keine URL!"
	msg2 = "Bitte erst einmal speichern"
	oDoc = thisComponent
	
	if oDoc.url = "" then
	  msgbox (msg1 & chr(13) & msg2, 16, "Fehler")
	  exit sub
	end if

	sDateiname =	FileNameOutOfPath(oDoc.URL)
	msgbox sDateiname
	sDatum = date()
	sDatumneu = Format(sDatum, "YYYY-MM-DD")
	msgbox sDatumneu
	sNeuname = sDatumneu + " " + sDateiname
	msgbox sNeuname
	sPfad = oDoc.url
	msgbox sPfad
	sURL = convertToURL(sNeuname)
	msgbox sURL
'	mFileProperties(0).Name = "Overwrite"
'	mFileProperties(0).Value = True
'	oDoc.storeAsUrl(sURL, mFileProperties())
	oDoc.storeAsUrl(sURL, dummy())

End Sub
Die auskommentierten Zeilen mit mFileProperties waren ein Versuch, der aber auch nichts brachte.

Die letzte Messagebox enthält wohl das Problem:
file:///2023-08-11%20Unbenannt%202.odt
Der Pfad sollte so aussehen wie der alte Pfad, tut er aber nicht. Muß ich jetzt den neuen Pfad irgendwie aus altem Pfad und neuem Dateinamen zusammensetzen, oder kann ich nicht einfach in dem Verzeichnis, wo die Datei ist, nur mit den Dateinamen arbeiten?

Am liebsten sollte das Makro unabhängig vom Speicherort der Datei funktionieren.

Ich bekomme jedenfalls die Fehlermeldung:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.task.ErrorCodeIOException
Message: SfxBaseModel::impl_store <file:///2023-08-11%20Unbenannt%202.odt> failed: 0xc10(Error Area:Io Class:Write Code:16).
Zu dieser Fehlermeldung finde ich per Google nichts Hilfreiches. Was also tun?

Gruß
Freischreiber
Zuletzt geändert von Freischreiber am Mo 14. Aug 2023, 09:30, insgesamt 1-mal geändert.
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von F3K Total » Fr 11. Aug 2023, 14:47

so?

Code: Alles auswählen

Sub DatumzuDateiname
	GlobalScope.BasicLibraries.LoadLibrary("Tools")
	dim oDoc as Object, msg1 as string, msg2 as string
	dim n as integer, sPfad as string, sURL as string, sDateiname as string, sNeuname as string, sDatum as string, sDatumneu as string
'	Dim mFileProperties(0) As New com.sun.star.beans.PropertyValue
	dim dummy()

	msg1 = "Sorry, das Dokument hat noch keine URL!"
	msg2 = "Bitte erst einmal speichern"
	oDoc = thisComponent
	
	if oDoc.url = "" then
	  msgbox (msg1 & chr(13) & msg2, 16, "Fehler")
	  exit sub
	end if

	sDateiname =	FileNameOutOfPath(oDoc.URL)
	msgbox sDateiname
	sDatum = date()
	sDatumneu = Format(sDatum, "YYYY-MM-DD")
	msgbox sDatumneu
	sNeuname = sDatumneu + " " + sDateiname
	msgbox sNeuname
	sPfad = replace(oDoc.url,oDoc.Title,"")
	msgbox sPfad
	sURL = convertToURL(sPfad + sNeuname)
	msgbox sURL
'	mFileProperties(0).Name = "Overwrite"
'	mFileProperties(0).Value = True
'	oDoc.storeAsUrl(sURL, mFileProperties())
	oDoc.storeAsUrl(sURL, dummy())

End Sub
Windows 11: AOO, LO Linux Mint: AOO, LO

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von Freischreiber » Fr 11. Aug 2023, 15:49

Hallo R,

leider nein.

Code: Alles auswählen

sPfad = replace(oDoc.url,oDoc.Title,"")
liefert immer noch den Pfad inklusive Dateinamen; der Titel ist nämlich leer.

Auch

Code: Alles auswählen

sPfad = replace(oDoc.url,sDateiname,"")
funktioniert nicht besser.

Gruß
Freischreiber

Edit: Liegt es daran, daß oDoc.url vielleicht kein String ist?
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2536
Registriert: Fr 10. Dez 2010, 10:01

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von karolus » Fr 11. Aug 2023, 16:44

Hallo

Oder so:

Code: Alles auswählen

from datetime import date

def isodate_prefix( *event ):
    iso_date = date.today().isoformat()
    doc = event.Source
    if doc.Title.startswith(iso_date) or not doc.hasLocation():
        return
    doc.Title = f"{iso_date}_{doc.Title}"
    doc.store()
    
def isodate_prefix_direkt( *_ ):
    iso_date = date.today().isoformat()
    doc = XSCRIPTCONTEXT.getDocument()
    title = doc.Title
    if title.startswith(iso_date) or not doc.hasLocation():
        return
    doc.Title = f"{iso_date}_{title}"
    doc.store()
Die untere Funktion kannst du direkt ausführen, die obere könntest du binden an:
→→Extras→→Anpassen→→Ereignisse:
ändere unten »speichern unter:« auf »Libreoffice«
ereignisse.png
ereignisse.png (43.67 KiB) 3638 mal betrachtet
Und wie immer wieder, das ist python… wenn du nicht weisst was du damit machen sollst, installiere apso.oxt von hier
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von Freischreiber » Fr 11. Aug 2023, 20:15

Hallo karolus,

also das hier

Code: Alles auswählen

from datetime import date
def isodate_prefix_direkt( *_ ):
    iso_date = date.today().isoformat()
    doc = XSCRIPTCONTEXT.getDocument()
    title = doc.Title
    if title.startswith(iso_date) or not doc.hasLocation():
        return
    doc.Title = f"{iso_date} {title}"
    doc.store()
benennt tatsächlich die Datei um, speichert sie aber offenbar nicht. Zumindest sehe ich nicht, wohin. Und wenn ich manuell "speichere", behält sie den umbenannten Dateinamen nicht!

Schön kurz ist es ja, aber besser verstehen tu ich es nicht.

Und Bildschirm-Interaktion à la "Datei ist noch nicht gespeichert" gibt es in Python wohl nur mit Zusatzmitteln?
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2536
Registriert: Fr 10. Dez 2010, 10:01

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von karolus » Fr 11. Aug 2023, 20:37

Hallo
Ändere:

Code: Alles auswählen

    if title.startswith(iso_date) or not doc.hasLocation():
        return
zu:

Code: Alles auswählen

    if title.startswith(iso_date):
        doc.store()
        return
achte auf die richtige Einrückung mit 4 bzw 8 Leerzeichen
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2536
Registriert: Fr 10. Dez 2010, 10:01

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von karolus » Fr 11. Aug 2023, 20:44

Und Bildschirm-Interaktion à la "Datei ist noch nicht gespeichert" gibt es in Python wohl nur mit Zusatzmitteln?
Geht auch, aber das ist etwas für Warmduscher 8-) nerds machen das ggf per print(…) aus einer interaktiven Sitzung
jupyter notebook
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von F3K Total » Sa 12. Aug 2023, 08:48

Moin,
Freischreiber hat geschrieben:
Fr 11. Aug 2023, 15:49
Hallo R,

leider nein.

Code: Alles auswählen

sPfad = replace(oDoc.url,oDoc.Title,"")
liefert immer noch den Pfad inklusive Dateinamen; der Titel ist nämlich leer.

Auch

Code: Alles auswählen

sPfad = replace(oDoc.url,sDateiname,"")
funktioniert nicht besser.

Gruß
Freischreiber

Edit: Liegt es daran, daß oDoc.url vielleicht kein String ist?
...verstehe ich nicht, habe ich unter Windos 10 und Linux Mint getestet. Funktioniert bei mir einwandfrei.
Du fragst doch ab, ob ein URL existiert, und wenn, dann gibt es auch den Dateinamen. Und auch den Doc.Title.
Der URL ist definitiv ein String, habe ich nochmal mit XRAY getestet.
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von Freischreiber » Sa 12. Aug 2023, 14:26

F3K Total hat geschrieben:
Sa 12. Aug 2023, 08:48
Funktioniert bei mir einwandfrei.
Es scheitert an Leerzeichen. Aus "Unbenannt 1.odt" wird "Unbenannt 1.odt2023-08-12 Unbenannt 1.odt". Beim Ersetzen durch "" wird nach Leerzeichen gesucht, da steht dann aber schon "%20".* Und dann wird nicht ersetzt :o

*oder umgekehrt :?
Zuletzt geändert von Freischreiber am Sa 12. Aug 2023, 14:33, insgesamt 1-mal geändert.
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 832
Registriert: Fr 28. Mär 2014, 10:41

Re: Makro, um dem Dateinamen eines LO-Dokuments ein Datum voranzustellen

Beitrag von Freischreiber » Sa 12. Aug 2023, 14:30

karolus hat geschrieben:
Fr 11. Aug 2023, 20:37
Hallo
Ändere:

Code: Alles auswählen

    if title.startswith(iso_date) or not doc.hasLocation():
        return
zu:

Code: Alles auswählen

    if title.startswith(iso_date):
        doc.store()
        return
achte auf die richtige Einrückung mit 4 bzw 8 Leerzeichen
Hast du es denn selbst mal probiert? Es benennt um, aber es speichert nicht unter diesem Namen. Nicht mal, wenn man Speichern drückt...
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten