Hallo Lilo,
mir ist eingefallen, dass ich bereits ein Makro habe, das ein
Verzeichnis samt Unterordnern auflöst, also genau das, was dir zu dem
von mir geschickten Makro noch fehlt.
Ich habe daraus jetzt ein vollständiges Programm gebastelt, das ein
gewähltes Verzeichnis mit allen Unterordnern bearbeitet und jeweils die
Automatik ausschaltet und das Dokument dann speichert. Den "Filter" in
der Select-Case-Anweisung im zweiten Makro kannst du ggf. anpassen.
Achtung: es gibt einen Fehler, wenn eine der zu bearbeitenden Dateien
geöffnet. Das ist zwar kein Problem, man schließt die Datei und lässt
das Programm nochmals laufn, aber besser ist, vorher daran zu denken,
denn es werden ja alle Dokumente erneut geändert, weil ich auf die
Abfrage verzichtet habe, ob die Automatik schon aus ist; das kannst du
ja nach Wunsch noch einbauen.
option explicit
Dim oSFA as object
Sub Verzeichnisbaum
Dim oDialog as Object
Dim sPfad as String
oDialog = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
oDialog.setDescription("Bitte das Wurzel-Verzeichnis auswählen")
if oDialog.execute() then
sPfad = oDialog.Directory
end if
if sPfad = "/" then
MsgBox "nichts ausgewählt!"
Exit sub
end if
oSFA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
Verzeichnisaufloesen(sPfad)
End Sub
sub Verzeichnisaufloesen(Pfad as string)
dim ListeVerz() as string
Dim PfadLokal as string
Dim obVerz as long, LaePfadLokal as long, i as long
Dim indLastFile as long, indLastFolder as long
dim arrPfad () as string
Pfadlokal = ConvertFromUrl(Pfad)
laePfadLokal = Len(PfadLokal)
ListeVerz = oSFA.getFolderContents(Pfad, TRUE)
obVerz = ubound(ListeVerz())
if obVerz = -1 then exit sub ' leeres Verzeichnis
' Dateien und/oder Ordner vorhanden
indLastFile = -1
indLastFolder = -1
for i = obVerz to 0 step -1
if oSFA.isFolder(ListeVerz(i)) then
if indlastFolder = -1 then indLastFolder = i
else if indLastFile = -1 then indLastFile = i
end if
if indLastFile >= 0 and indLastFolder >= 0 then exit for
next
' Dateien
for i = 0 to indLastFile
if not oSFA.isFolder(ListeVerz(i)) then
' msgbox ListeVerz(i)
arrPfad() = split(ListeVerz(i), ".")
Select Case arrPfad(UBound(arrPfad))
Case "odt", "ott"
AutoAus(ListeVerz(i))
Case Else
' msgbox ListeVerz(i)
end Select
ListeVerz(i) = ""
end if
next
' Ordner
for i = 0 to indLastFolder
if ListeVerz(i) <> "" then
Verzeichnisaufloesen(ListeVerz(i))
end if
next
end sub
Sub AutoAus (pfad as string)
Dim sURL as string
Dim oDoc as object
dim docArgs()
Dim Pstyles as object, style as object, i as long, upper as long
oDoc = StarDesktop.loadComponentFromURL(pfad, "_blank", 0, docArgs() )
PStyles = oDoc.StyleFamilies.getByName("ParagraphStyles")
upper = PStyles.Count - 1
for i = 0 to upper
style = PStyles.getByIndex(i)
style.isAutoUpdate = False
next
oDoc.store
oDoc.close(TRUE)
end sub
Gruß
Gerhard
Am 12.11.2018 um 12:54 schrieb Lilo von Hanffstengel:
Hallo Hans-Werner,
Am Mon, 12 Nov 2018, um 11:17:52 [GMT +0000] (ist 12:17 wo ich lebe)
schrieb OoOHWHOoO:
mit PERL könnte man das so machen:
Mit einem kleinen PERL-Programm [2] die zu ändernden Dateien systemweit
einsammeln und dann über eine Schleife für jede dieser Dateien das Makro
[1] unsichtbar ( = LO Oberfläche wird nicht gestartet ) ausführen.
Ich habe es mal mit Deiner Datei getestet. Da funktionierte der
"unsichtbare" Makro-Aufruf und die Datei wurde wie gewünscht
modifiziert.
Die Schleife in dem PERL-Programm habe ich nur "angedeutet".
Ich kenn ja selbst Perl seit Jahrzehnten zu Genüge, aber Danke.
Aber bitte erst mal in einem definierten Umfeld testen und überprüfen,
ob alles so funktioniert, wie Du es Dir vorstellst.
Klar, ich bin da vorsichtig. Ich will ja nicht mein Büro lahmlegen. ;)
Danke für die weitere Anregung. Insebsondere mit dem Makroaufruf über
die Kommandozeile :)
[1] MAKRO ( macro:///Standard.AutoAus.AutoAus - Das Makro "AutoAus"
stehe im Modul "AutoAus" in der Bibliothek "Standard" )
Option Explicit
Sub AutoAus (D as String) ' Datei
' "AutoAus" nach einer Idee von Gerhard Weydt ergänzt um:
'
' + Übergabe Datei(name) an Makro.
' + Datei unsichtbar öffnen.
' + Datei Speiuchern und schließen.
Dim oD as Object ' [object] Document
Dim oPStyles as Object ' [object] PStyles
Dim oStyle as Object ' [object] Style
Dim aD() as Variant ' [array] Dummy
Dim iStyle as long ' [index] Style
Dim aPV(0) as New com.sun.star.beans.PropertyValue
aPV(0).name = "Hidden"
aPV(0).value = True
oD =
StarDesktop.loadComponentFromURL(ConvertToURL(D),"_blank",0,aPV())
' Datei 'unsichtbar' öffnen
oPStyles = oD.StyleFamilies.getByName("ParagraphStyles")
For iStyle = 0 To oPStyles.Count-1 Step 1
oStyle = oPStyles.getByIndex(iStyle)
oStyle.isAutoUpdate = False
Next iStyle
oD.StoreAsURL(ConvertToURL(D),aD()) ' Datei speichern
oD.Close(False) ' Datei schließen
End Sub
[2] P E R L ( AutoAus.pl )
use strict;
use warnings;
my $D; # Dateiname
my $L; # LibreOffice
my $M; # Makro
$L = "C:/Program Files/LibreOffice/program/soffice.exe"; #
LibreOffice-Programm
# ITER: Über alle zu aktualisierenden Dateien:
$D = "E:/TMP/standard-defekt1.odt"; # Zu aktualisierende Datei
$M = "macro:///Standard.AutoAus.AutoAus($D)"; # Makro-Aufruf mit zu
aktualisierender Datei
`"$L" --nologo "$M"`; # Makro "unsichtbar" ausführen
# ITER-END
Ansonsten könnte ich mir noch diese krude Lösung vorstellen:
Mit zgrep in allen OTT-Vorlagen suchen
bei den gefundenen Dateien
styles.xml entapcken
Alle Atribute style:auto-update="true" entfernen
XML speichern
alles wieder in die OTT-Datei packen
Machbar auch in Perl (ich muss mal schauen ob da nicht sogar Module
für die Bearbeitung von ODF existieren, die da es einfach machen).
Aber ich bin immer vorsichtig direkt in den Dateien rum zu arbeiten
und nicht das Tool (=LO) zu benutzen das dazu programmiert wurde.
In jedem Fall werde ich deine Idee die nächsten Tage testen und später
Feedback geben wie alles gelaufen ist.
Einen schönen Tag noch.
@users-de Liste
Bitte nicht ärgern, wenn einige Tage kein reply in die Liste kommt,
die in meienr Firma ist ja auch noch zu machen, und hoffentlich
vergesse ich darüber nicht das Feedback.
--
Freundliche Grüße
GwenDragon // Lilo von Hanffstengel
--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Datenschutzerklärung: https://www.documentfoundation.org/privacy
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.