Einfach und schnell deaktivierung von 'Automatische Aktualisierung' in allen Absatzvorlagen

Hallo Liste,

Es existieren bei uns im Büro alte Dateivorlagen, in denen bei manchen(!)
Absatzvorlagen das 'Automatisch aktualisieren' gesetzt ist.
Wahrscheinlich aus irgendeiner uralten OpenOffice mitgeschleppt.

Gibt es eine Möglichkeit, die 'Automatische Aktualisierung' in
allen(!) Absatzvorlagen einer Dokumentvorlage (OTT) zu löschen?
Sich per Hand durch zu klicken ist ja nicht sonderlich praktikabel bei
zig Absatzvorlagen in zig Dateien.

Ich bin in LO-Basic/Makros nicht so bewandert, meine tägliche Arbeit sind
andere Programmiersprachen.

Kennt ihr da irgendeinen Befehl in LO, ein Macro oder externe Batch?

Ich danke euch schon mal für eure Hilfe.

Hallo Lilo,

das folgende Makro habe ich mit einer Dokument-Vorlage (.ott), getestet, bei der ich bei einer Absatzvorlage die Automatik gesetzt hatte. Wie gewünscht, war danach der Haken weg. Das Makro setzt sämtliche Automatikeinträge auf aus! Das Speichern danach habe ich bewusst nicht ins Makro genommen.
Bitte aber auf einer Kopie ausprobieren, bevor du das in größerem Maßstab ausführst.

Sub AutoAus

Dim Pstyles as object, style as object, i as long, upper as long

PStyles = ThisComponent.StyleFamilies.getByName("ParagraphStyles")
upper = PStyles.Count - 1
for i = 0 to upper
    style = PStyles.getByIndex(i)
    style.isAutoUpdate = False
next

end sub

Gruß

Gerhard

Hallo Gerhard,

das folgende Makro habe ich mit einer Dokument-Vorlage (.ott), getestet,
bei der ich bei einer Absatzvorlage die Automatik gesetzt hatte. Wie
gewünscht, war danach der Haken weg. Das Makro setzt sämtliche
Automatikeinträge auf aus! Das Speichern danach habe ich bewusst nicht
ins Makro genommen.
Bitte aber auf einer Kopie ausprobieren, bevor du das in größerem
Maßstab ausführst.

Sub AutoAus

Dim Pstyles as object, style as object, i as long, upper as long

PStyles = ThisComponent.StyleFamilies.getByName("ParagraphStyles")
upper = PStyles.Count - 1
for i = 0 to upper
    style = PStyles.getByIndex(i)
    style.isAutoUpdate = False
next

end sub

Das Makro klappt und setzt es korrekt auf Aus.

Mal schauen wie ich das dann im größeren Umfang i nder Linux-Shell
verwende, damit ich das besser automatisieren kann; wahrscheinlich als
Python-Script.

Erst mal ist das Problem damit erledigt.

Danke sehr, Gerhard, für deinen Tipp.

ÜS: Ich werde wohl mal "Andrew Pitonyak's OpenOffice Macro Information" auf
http://www.pitonyak.org/oo.php durchlesen müssen, um für später
gewappnet zu sein, wenn es wieder OO/LO-Makros braucht.

Hallo Lilo,

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".

Aber bitte erst mal in einem definierten Umfeld testen und überprüfen, ob alles so funktioniert, wie Du es Dir vorstellst.

Gruß
Hans-Werner ;-))

[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

------ Originalnachricht ------

Hallo Hans-Werner,

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. :wink:

Danke für die weitere Anregung. Insebsondere mit dem Makroaufruf über
die Kommandozeile :slight_smile:

[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.

Hallo Lilo,

kann man natürlich auch so machen, wie von Dir skizziert.

Aber ich würde Gerhards Makro vorziehen, da diese Sprachelemente eben genau für LO/OO "gemacht" sind ...

Gutes Gelingen,
Gruß
Hans-Werner ;-))

------ Originalnachricht ------

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