Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von balu »

Hallo liebe Gemeinde,

ich hab mir mal wieder ein Problem ausgesucht.
Und zwar möchte ich durch die Datei1 die Datei2 HIDDEN (versteckt im Hintergrund) laden und die Zellvorlagen von dort nach Datei1 kopieren. Finde aber keinen geeigneten Ansatz dazu.

Andrew Macros in deutsch durchgelesen, und die englische Version nach *Styles* durchsucht, so wie Dannenhöfer besucht. Alles ohne Erfolg.

Also hatte ich mir gedacht; Datei2 entpacken und die sytyles.xml anschaun. Und dort stehen ja nicht nur die Namen der einzelnen Zellvorlagen, sondern auch so wichtige und nützliche Infos wie z.B. ob die Vorlage mit einer anderen Verknüpft ist, und welche Einstellungen aktiv gesetzt sind.
Hier ein Beispiel.

Code: Alles auswählen

  <style:style style:name="DATUM_5f_Wochenende" style:display-name="DATUM_Wochenende" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N109">

   <style:table-cell-properties fo:background-color="#99ccff" style:text-align-source="fix" style:repeat-content="false" fo:border="0.002cm solid #808080" fo:padding-bottom="0.035cm" fo:padding-left="0.085cm" fo:padding-right="0.035cm" fo:padding-top="0.035cm" style:vertical-align="middle"/>
Jetzt hatte ich mir überlegt diese Daten auszulesen, und in der Zieldatei (Datei1) neue Zellvorlagen damit zu erstellen. Die einzelnen Zellvorlagennamen in die Datei1 einzulesen stellt kein Problem dar, das habe ich schon. Und es dürfte wohl auch kein Problem sein auszulesen ob, und wenn ja mit welcher anderen Zellvorlage diese verknüpft ist.

Aber das Hauptproblem ist momentan die einzelnen Einstellungen, so wie bei style:table-cell-properties zu sehen ist, auszulesen, da ja nicht jede Zellvorlage die gleichen Einstellungen hat.


Meine Fragen nun an euch.
- Wie würdet ihr mein Vorhaben (die Zellvorlagen kopieren) angehn?
- Wie bekomme ich am geschicktesten die Einstellungen einer Zellvorlage ausgelesen?
- Könnt ihr mir helfen?

Ich bedanke mich schon mal für eure Bemühungen, und freue mich auf eure antworten :D.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von komma4 »

balu hat geschrieben:- Wie bekomme ich am geschicktesten die Einstellungen einer Zellvorlage ausgelesen?
Ich sehe nach meinen Versuchen in der Richtung keinen anderen Weg, als in einer Schleife die Eigenschaften auszulesen und in der neuem zu setzen.
Das kannst Du mit Basic machen... siehe Array oStyle.PropertySetInfo.Properties()


Hilft Dir das weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von balu »

Hallo Winfried,

Danke für deine Antwort, aber ich komme nicht weiter.
Ich sehe nach meinen Versuchen in der Richtung keinen anderen Weg, als in einer Schleife die Eigenschaften auszulesen
Einfach kopieren geht nicht, also wie schon gedacht Plan B.

Das kannst Du mit Basic machen... siehe Array oStyle.PropertySetInfo.Properties()
Und da setzt es bei mir momentan echt aus. Eine einzelne Propertie wie z.B. DisplayName auszulesen ist für mich kein Problem. Aber hier und jetzt ein ganzes Array auslesen, da machts bei mir nicht "Klick", und ich kriegs nicht hin.

Will damit sagen, das ich so was

Code: Alles auswählen

Dim A As Variant
A = Array("Fred","Tom","Bill")
for i = 0 to 2
Msgbox A(i)
next 
verstehe und nahvollziehen kann. Aber eine Schleife für die jetzige Situation krieg ich nicht ans Laufen.

Code: Alles auswählen

Sub Main
	oDok = thisComponent
	oVorlAus = oDok.getStyleFamilies.getByName("CellStyles")
	oStyle = oVorlAus.getByIndex(14)
	Dim B As Variant
	B = Array(oStyle.PropertySetInfo.Properties)
		for i = 0 to 20
			Msgbox B(i)
		next i	
End Sub
Irgendwie und irgendwo mache ich jetzt einen Fehler, den ich aber nicht mehr sehe. Kannst Du, oder jemand anderer mir noch mal auf die Sprünge helfen?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von komma4 »

Das funktioniert bei mir:

Code: Alles auswählen

oAltCellStyles = oDok1.StyleFamilies.getByName( "CellStyles" )
oNeuCellStyles = oDok2.StyleFamilies.getByName( "CellStyles" )


For lStyle = 0 to oAltCellStyles.Count - 1 

   sAltStyleName = oAltCellStyles.getByIndex( lStyle ).Name 
   oAltCellStyle = oAltCellStyles.getByIndex( lStyle )
   
   If NOT oNeuCellStyles.hasByName( sAltStyleName ) Then
      ' erzeugen und einfügen
      oNeuCellStyle = oDok2.createInstance( "com.sun.star.style.CellStyle" ) 
      oNeuCellStyles.insertByName( sAltStyleName , oNeuCellStyle )

      ' alle Eigenschaften bearbeiten
      aProperties = oAltCellStyle.PropertySetInfo.Properties      
      
      For lProp = 0 To UBound( aProperties )
       sName = _
        oAltCellStyle.PropertySetInfo.Properties( lProp ).Name
       If oAltCellStyle.getPropertyState( sName ) = _
          com.sun.star.beans.PropertyState.DIRECT_VALUE Then
          oNeuCellStyle.setPropertyValue( _
           sName, oAltCellStyle.getPropertyValue( sName ) )
       End If
          
      Next lProp
      
      
   End If

Next lStyle

Ist nicht alleine auf meinem Mist gewachsen - nach etwas Recherchen habe ich den Durchbruch erzielt, durch dieses Posting

Code: Alles auswählen

' Oliver Brinzing
' 2007-12-13
' http://www.mail-archive.com/dev@openoffice.org/msg08280.html
' Zugriff DIRECT_VALUE

Und bevor Du -oder andere- Zeit vergeuden mit:
funktioniert nicht hat geschrieben:oNeuCellStyle = oDok2.createInstance( "com.sun.star.style.CellStyle" )
oNeuCellStyles.insertByName( sAltStyleName , oAltCellStyle )
Das klappt nicht!



Kommst Du damit zurecht?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von balu »

Hallo Winfried,
Das funktioniert bei mir:
Oh jaaa! Das funktioniert auch bei mir :D.
Auch wenn die Lösung nicht komplett von dir ist, so bedanke ich mich recht Herzlichen für deine Arbeit.

Ich habe mir nicht die Mühe gemacht deine Warnung trotzdem mal auszuprobieren, da ich keine Zeit dafür hatte. Ich würd aber mal so ausm Stehgreif sagen, das es wohl damals in den 2.x.x Versionen funktionierte.

Kommst Du damit zurecht?
Ja, bin ich!
Die Schleife um

Code: Alles auswählen

oStyle.PropertySetInfo.Properties()
sieht doch anders aus als meine missglückten Versuche. Darauf wär ich wohl mein lebtag nicht gekommen.

Ich häng jetzt mal mein bisheriges Ergebnis an. Es fehlt noch ein wenig feinschliff, aber es funktioniert schon mal.
Hier ne kurze Anleitung.

- Datei öffnen
- Auf den Grünen Button klicken
- Nun irgendeine x-beliebige Calc-Datei (.ods) mit Zellvorlagen auswählen. Es ist wichtig das nur so eine ausgewählt wird, da noch keine Überprüfung wegen Fremdformat eingebaut ist. Und ferner darf die betroffene Datei auch nicht schon geöffnet sein, da ich dafür auch noch keine Überprüfung für eingebaut habe.
- Jetzt ein Verzeichnis auswählen wohin die Datei anschließend gespeichert werden soll. Der Originale Dateiname wird beim speichern um Datum und Uhrzeit ergänzt. Also wird z.B. aus:
Vorlagen-Test.ods
dann
_Vorlagen-Test_10 03 2012 10-18.ods
Dadurch bleibt die Originale unverändert.

- Nach dem das Zielverzeichnis ausgewählt wurde, wird ein Button "OK und weiter." freigeschaltet. Darauf klicken.
- Beim nächsten klick auf OK wird die ausgewählte Datei Hidden (versteckt im Hintergrund) geöffnet.
- "OK" verschwindet nach erfolgtem öffnen, und "OK und weiter" erscheint. Darauf klicken.
- Der jetzige Ablauf wird im Dialog beschrieben. Er kann nicht abgebrochen werden!
- Wenn Fertig, dann kommt wieder "OK und weiter". Darauf klicken.
- Ist die kommende Seite abgearbeitet, erscheint dann "OK und Beenden". Noch nicht drauf klicken, sondern den dortigen Text lesen, besonders der im Grünem Feld. Und dann klicken.

Nach erfolgter Auswahl zu löschender Vorlagen, den Löschen Button klicken. Jetzt erscheint kein Dialog mehr, sondern nur noch Print-Anweisungen. Nach jedem klick auf OK bitte so lange warten bis die nächste erscheint.

Zu guter letzt kommt eine die unter anderem "... Programm ist zu Ende!" beinhaltet. Und damit ist dann alles erledigt. Die zuvor ausgewählte Datei ist von den Vorlagen befreit, und unter einen erweiterten Dateinamen gespeichert. Und die Steuerungsdatei ist auch wieder von den eingelesenen Vorlagen befreit und dadurch bereit für eine andere Datei.


Eine Sache an "deinem" Makro ist leider nicht ganz so schön, die Vorlagen werden leider nicht mit "Mutter" & "Kind" erstellt. Es gibt also keine Verknüpfung zu einer Höher gelegenen Vorlage, sie beziehen sich alle dabei auf Standard. Doch für mich ist das erstmal egal, da ich ein Ziel erreicht habe.



Gruß
balu
Dateianhänge
Alle_ZellVorlagen_aus_anderer_Datei_kopieren.ods
(22.16 KiB) 83-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von Karolus »

Hallo
Vielleicht geht das ganze wesentlich einfacher:

Code: Alles auswählen

Sub alleVorlagenimportieren

  dim myFileProp() as new com.sun.star.beans.PropertyValue
  url = "file:///home/balu/andereDatei.ods"
  oStyleFamilies = ThisComponent.getStyleFamilies()
  oStyleFamilies.loadStylesFromURL( url, myfileProp() ,0 )

End Sub
Das importiert anscheinend alle Vorlagen ( auch Seitenvorlagen) der anderen Datei.

Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von komma4 »

SIehste mal... da die CALC-Oberfläche das Importieren von Vorlagen nicht anbietet ging ich davon aus, dass diese Funktion .loadStylesFormURL() auch nicht vorhanden ist.... und vergass, mit XRAY oder so nachzuschauen.

Nachgeholt, gesehen... gleich im SDK noch die Parameter nachgeschaut....

und dann kann ich Dein Beispiel ergänzen durch

Code: Alles auswählen

  dim myFileProp(2) as new com.sun.star.beans.PropertyValue
  
  myFileProp(0).Name = "OverwriteStyles"
  myFileProp(0).Value = FALSE
  myFileProp(1).Name = "LoadCellStyles"
  myFileProp(1).Value = TRUE
  myFileProp(2).Name = "LoadPageStyles"
  myFileProp(2).Value = FALSE
  
Danke, Karo!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Zellvorlagen von Datei1 nach Datei2 kopieren.

Beitrag von balu »

Hallo Karo und Winfried.

An euch beiden: Danke! Danke! Danke! :D.

Der Code von Karo ist so kurz, knackig und extrem schnell, das es eine wahre Freude ist zuzusehen. Mal zur Info wie schnell er ist.
Beim Einfügen von weit über 500 Vorlagen aus einer Testdatei hatte es mit dem alten Code ca. 3 Minuten bei mir gedauert. Jetzt nur noch ca. 10 Sekunden. Welch heftiger Unterschied.

Das auch die Hierarchie dabei erhalten bleibt, ist natürlich klasse. So bleiben "Mutter" & "Kind(er)" natürlich zusammen. Und das eröffnet mir nun wiederum Möglichkeiten, wovon ich nicht zu Träumen wagte.

Einen kleinen Wermutstropfen gibt es aber dennoch. Ich muss nun die ProgressBar rausschreiben, da sie sich nun wirklich nicht mehr lohnt. :wink:



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten