Tabelle in andere Datei kopieren

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

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo Kenner und Könner,

ich möchte eine Tabelle aus einer in eine ander Date kopieren,
das ist auch ersteinmal recht einfach mit diesem aufgezeichneten Makro kein Problem

Code: Alles auswählen

sub CopyATable
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Table"
args1(0).Value = Array(1) ' "TestTabelle" '

dispatcher.executeDispatch(document, ".uno:SelectTables", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(2) as new com.sun.star.beans.PropertyValue
args2(0).Name = "DocName"
args2(0).Value = "MasterFile"
args2(1).Name = "Index"
args2(1).Value = 32767
args2(2).Name = "Copy"
args2(2).Value = true

dispatcher.executeDispatch(document, ".uno:Move", "", 0, args2())

end sub
ich möchte dieses Makro in eine Schleife einbinden bzw aus der Schleife heraus aufrufen also
CopyATable( Tabellenname as String)
und einen Tabellennamen übergeben, und da fangen die Proleme für mich an
1. wie ersetzte ich zB args1(0).Value = Array(1) Array(1) durch eine String Variable?
2. kann man das auch ohne Dispatcher realisieren, Hr. Dannenhöfer zeigt es nur Datei intern?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Tabelle in andere Datei kopieren

Beitrag von Karolus »

Hallo
lass mich raten, du bist hier dran

In LO-Calc kennt ``.Sheets`` die Methode:

Code: Alles auswählen

importSheet(
    [in] com.sun.star.sheet.XSpreadsheetDocument srcDoc, 'Das Quelldocument'
    [in] string srcName, 'der Tabellenname'
    [in] long nDestPosition 'Position im Zieldokument'
 ) 
das ist die Methoden-signatur copy&paste aus Mri heraus mit Kommentar von mir

Falls du auf Aoo beharrst - musst du selber arbeiten.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabelle in andere Datei kopieren

Beitrag von balu »

Hallo clag,

ich gehe jetzt mal nicht davon aus das Karolus recht hat, mit dem Thread aus dem englischem Forum. Denn dann hättest Du wohl schon längst die Lösung gefunden.
ich möchte eine Tabelle aus einer in eine ander Date kopieren
Diesmal stimmt der olle Spruch wie die Faust aufs Auge: "Viele Wege führen nach Rom."

Willst Du wirklich eine 1:1 Kopie machen, oder willst Du nur etwas bestimmtes kopieren?
Erzähl mal mehr dazu. Denn jenachdem was Du kopieren willst, gibt es eine seeeehr kompakte und Kurze Lösung, oder es wird ein wenig umfangreicher.

1. wie ersetzte ich zB args1(0).Value = Array(1) Array(1) durch eine String Variable?
Stichwort: Andrew Pitonyak!
Ich schlag mich auch grad mit dem Thema Array herum, und arbeite auch mit Andrew.

2. kann man das auch ohne Dispatcher realisieren, Hr. Dannenhöfer zeigt es nur Datei intern?
Wie schon gesagt, was willst Du wirklich kopieren? Und, ja natürlich geht das ohne Dispatch, mann muss nur wissen was man genau will.


Wenn ich jetzt nur wüsste ob ich dich nicht damit überfordere, dann würde ich dich jetzt mal folgendes fragen:
"Kennst du eigentlich meinen Rasterkalender mit Ferien?"
Da ist nämlich indirekt eine Teillösung zu einer Kopiermethode vorhanden. ;-)



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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo Karolus, Balu und alle anderen

ja ich wollte ein ganzes Tabellenblatt "mit Haut und Haaren" kopieren so wie es das aufgezeichnete Makro tut
das anfängliche Problem der zu übergebenden Variablen als Text obwohl das aufgezeichente Makro einen Index möchte
konnte ich mit einer weiteren Schleife lösen die den Index des Tabellennamen abfragt,
ist zwar nen bischen von hinten durch die Brust in Auge aber tut jetzt was es soll.

Code: Alles auswählen

    if thisComponent.sheets.hasByName(mySheet) then
        for i=0 to ubound(thisComponent.sheets.ElementNames())
            if thisComponent.sheets.ElementNames(i) = mySheet then iOpen = i  ' set the variable for sheet index'
          next
    else
        print "sheet " & MySheet & " not found"
    end if
..
..
    args1(0).Name = "Tables"
    args1(0).Value = Array(iOpen) ' use the Variable '
 
ABER wo ich nun überhauptnicht mit klar komme ist,
das ich den restlichen Tag mit der Fehlersuche verbracht habe warum das Makro nicht in einer Schleife über mehrere Dateien funktioniert?
Nun kenn ich den Grund verstehe es aber absolut nicht!

Die Dateien aus denen ich das Tabellenblatt kopieren wollte habe ich "read only" geöffnet, (man will ja nicht versehentlich etwas verändern)
und damit versagt es schlichtweg das kopieren der Tabelle ohne jeglichen Hinweis :-x
da muss man erst mal drauf kommen, kopieren ist ein reiner Lesevorgang wieso wird das kopieren von Inhalt geblockt bei "read only"?

Vielleicht hat jemand eine Erklärung für dies merkwürdige Verhalten?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Tabelle in andere Datei kopieren

Beitrag von Karolus »

Code: Alles auswählen

...
iopen = thisComponent.Sheets.getByName( mysheet ).RangeAddress.Sheet
... 
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabelle in andere Datei kopieren

Beitrag von balu »

Hallo clag,
warum das Makro nicht in einer Schleife über mehrere Dateien funktioniert?
[...]
kopieren ist ein reiner Lesevorgang wieso wird das kopieren von Inhalt geblockt bei "read only"?
Sicher bin ich mir auch nicht (da nicht getestet), aber haben die zu kopierenden "read only" Dateien den Fokus?

Ich frage deshalb, weil ich mal ne ähnliche "Nix-und-nimmer-verstehen-Situation" hatte bei der ich ein HIDDEN geladenes Dokument kein Fenster fixieren konnte.

Code: Alles auswählen

.freezeAtPosition(0,4)
Der Grund war HIDDEN, da man dort nicht den controler aktivieren kann um zu fixieren. Und vielleicht ist das ja auch so ähnlich bei "read only".

Ich meld mich nachher noch mal wieder. Will mal eben was anderes testen (nein nicht wegen "read..").



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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo Karolus,

ahh die Zeile sieht irgendwie erheblich eleganter aus!

Danke
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo Balu,

danke für den Hinweis werde ich gleich mal checken,
aber den Fokus muß das zum lesen geöffnete Dokument eigentlich haben,
denn die Tabellennamen habe ich immer zum Prüfen aktuell ausgelesen und anzeigen lassen!?

edit:
wenn ich eine Datei manuell "nur lesen" öffne ist im Menü > Bearbeiten > Tabelle > verschieben/kopieren ausgegraut,
das ist auch wieder irgendwie logisch, aber da haben die Entwikler etwas zu früh die Tür zugemacht.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabelle in andere Datei kopieren

Beitrag von balu »

Hallo clag,
aber den Fokus muß das zum lesen geöffnete Dokument eigentlich haben
Wenn du über mehrere "read only" Dateien eine Schleife laufen lässt, wechselst Du dann dabei auch den Fokus?
Es kann ja immer nur eine Datei den Fokus haben, und zwar die die Du siehst.

Aber davon ab, jetzt mal zu dem warum ich mich wie angekündigt noch mal melden wollte.
ja ich wollte ein ganzes Tabellenblatt "mit Haut und Haaren" kopieren so wie es das aufgezeichnete Makro tut
Kopiert das aufgezeichnete Makro auch die Drawpage eines Tabellenblatt? Mit anderen Worten, werden auch Listenfelder und Buttons mit kopiert? Wenn ja, dann hast Du Glück. Wenn nein, dann ist es mit deinem Makro alleine nicht getan.

Wenn Du keine Drawpage zum kopieren hast bzw nicht brauchst, dann könnte ich dir, wie schon einmal gesagt, meinen Rasterkalender empfehlen. Denn der fügt eine Tabelle nach dem Prinzip
-> Einfügen
-> Tabelle aus Datei
ein.
Da ich das nicht brauchte, hatte ich mir keine Gedanken wegen der Drawpage gemacht. Bin mir aber weitestgehend sicher das dies kein Problem darstellen sollte das dementsprechend zu ergänzen.



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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo Balu,

uhhh, also ehrlich gesagt hatte ich mir über die DrawPage noch keine Gedanken gemacht,
ich war ja bis jetzt mit dem blanken kopieren schon an meinem Basic Limit :roll:

Aber "puh Schwein gehabt" ein auf der zu kopierenden Tabelle platierter Button wird mit kopiert,
also würde ich jetzt behaupten bei dieser Art des kopierens stellt die DrawPage kein Problem dar.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Tabelle in andere Datei kopieren

Beitrag von komma4 »

Vielleicht hilft das weiter:

Code: Alles auswählen

Sub copySheetToNewDoc

sMakroName = "copySheetToNewDoc"
sMakroVersion = "2010-03-03"


oDok = ThisComponent

If Not oDok.supportsService(_
   "com.sun.star.sheet.SpreadsheetDocument" ) Then
   Msgbox "Dieses Makro ist für ein Calc-Dokument, beende", 16 ,_
   sMakroName & " " & sMakroVersion
   Exit Sub
End if
If NOT oDok.hasLocation() Then 
   Msgbox "Dieses Makro funktioniert nur bei gespeicherten " & _
   "Dokumenten, beende", 16 ,_
   sMakroName & " " & sMakroVersion
   Exit Sub
End if


' Name des alktuellen Tabellenblatts
sName = oDok.CurrentController.ActiveSheet.Name


' neues Dokument
oDeskNeu = createUnoService( "com.sun.star.frame.Desktop" )
sNeuURL = "private:factory/scalc"
oNeuDok = oDeskNeu.loadComponentFromURL( sNeuURL, "_blank", 0, Array() )
oBlaetter = oNeuDok.Sheets()

'
If oBlaetter.Count() > 255 Then 
   Msgbox "Ziel Calc-Dokument hat bereits zuviele Blätter" & _
   CHR(10) & "Kann nicht einfügen" , 16 ,_
   sMakroName & " " & sMakroVersion
   Exit Sub  
Else
   If oBlaetter.hasByName( sName ) Then
      sNeuerName = neuerName( oBlaetter, sName )
   Else 
      sNeuerName = sName
   End If

   oBlaetter.insertNewByName( sNeuerName, 0 )
End If

oZiel = oBlaetter.getByName( sNeuerName )

' Blatt zur Quelle verlinken
oZiel.link( oDok.getURL(), sName, "calc8", "" , _
com.sun.star.sheet.SheetLinkMode.NORMAL )
'Link zur Quelle auflösen
oZiel.setLinkMode( com.sun.star.sheet.SheetLinkMode.NONE ) 

' anzeigen
oNeuDok.CurrentController.setActiveSheet( oZiel )

End Sub

Function neuerName( oBlaetter, sName ) 

sNeuerName = sName 
' eindeutigen Namen generieren,
' durch Anhängen von Unterstrich und Zähler
Do While oBlaetter.hasByName( sNeuerName ) 
   i = i + 1
   sNeuerName = sName & "_" & i
Loop
neuerName = sNeuerName

End Function
Funktioniert hier (immer noch) auch mit AOO 4.1.1
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)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo zusammen,

@ komma4,
erst einmal besten Dank für deine Hilfe und Beispielcode, da gibt es für mich immer etwas zum rausfischen.

@ Karolus,
Karolus hat geschrieben:lass mich raten, du bist hier dran
hatte den Link gar nicht so recht wahrgenommen, und ja mit deiner Vermutung liegst du richtig,
das war der Auslöser mir ein weiteres Basic Übungsprojekt aufzuhalsen, ist jetzt auch soweit lauffähig :)

am liebsten würde ich mit drei Calc Dateien arbeiten
1. den Info und Makroträger
2. die Ziel Datei
3. aktuell eingelesene Datei

und da frickle ich gereade noch dran rum.....
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabelle in andere Datei kopieren

Beitrag von balu »

Hallo clag,
mir ein weiteres Basic Übungsprojekt aufzuhalsen
Ach so ist das! Das möchtest Du also, ein Übungsprojekt!

am liebsten würde ich mit drei Calc Dateien arbeiten
1. den Info und Makroträger
2. die Ziel Datei
3. aktuell eingelesene Datei

und da frickle ich gereade noch dran rum.....
Wenn Du also wirklich in echt und ohne Witz/Scherz etwas zum Üben haben willst, was auch noch die drei aufgelisteten Punkte beinhaltet, dann könnte ich dir ja eine sehr sehr sehr sehr Umfangreiche Aufgabe stellen. Wobei der Punkt 3 vielleicht nicht dabei wäre, was aber kein Beinbruch wäre da Du schon mit den ersten beiden Punkten sehr viel zu tun hättest.

Du kannst dich vielleicht noch daran erinnern das ich in den vergangenen Jahren hier im Basic-Forum hin und wieder so einige Fragen gestellt hatte. Bei einigen hattest Du mir sogar entweder geholfen, oder sogar nützlice Tipps gegeben. Und bei anderen warst Du nur kurzzeitig dabei oder hast es nur so mitgelesen. Vielleicht erinnerst Du dich noch an die Themen "Diagramm"? Mal so als Beispiel.

Nun, ich könnte dir folgendes Übungsprojekt vorschlagen, welches auch für diejenigen Interessant wäre die in einer Firma die Anwesenheit ihrer Mitarbeiter protokollieren müssen. Aber nur für kleinere Betriebe, nix in der Größenordnung von z.B. BMW oder VW.
Es ist so gesehen ein Dienstnachweis.

Okay, mein Dienstnachweis hat nicht sehr viele und sehr komplizierte oder komplexe Formeln -{Ausnahmen bestätigen die Regel}-, die alle im Makro gelöst werden müssen, aber dafür gibt es genügend andere Stolperfallen und Probleme die umschifft werden müssen, wenn erst mal die gesamten Anforderungen feststehen.

Falls Du interesse daran hast, dann könnte ich dir die gesamten Anforderungen demnächst mal auflisten. Eins kann ich dir aber schon mal vorweg verraten, es wird fast alles über eine Art Grafische Oberfläche gehandhabt, Stichwort: Dialoge.

Ich weiß das mein Dienstnachweis noch nicht perfekt ist, weder Optisch noch vom Makro-Code aus her, aber er funktioniert und er wird auch schon seit längerem Problemlos eingesetzt. Nein! Nicht von mir und auch nicht bei mir!

Und wer weiß, vielleicht bekommst Du ihn ja besser hin als ich ;-)

Was mich interessieren würde, was für eine Aufgabe hat denn dein momentaniges Projekt, magst Du was dazu sagen?



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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo zusammen,

habe erstmal fertig :)

Also hier mal mein Versuch aus gleichnamigen Calc-Dateien mit austeigender Nummerierung
eine bestimmtes Tabellenblatt zu kopieren und alle in einem weiteren Calc-Dokument zusammen zu fassen.
TabellenblattSammler.ods
(16.93 KiB) 188-mal heruntergeladen
kritisches betrachten und kommentieren ist erwünscht.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Tabelle in andere Datei kopieren

Beitrag von balu »

Hallo clag,

Datei habe ich noch nicht getestet, aber das Makro hab ich mir angeschaut.

Sa sag mal, wieviele Jahre beschäftigst Du dich eigentlich schon mit Basic?
kritisches betrachten und kommentieren ist erwünscht.
Na dann wolln ma mal!

Wenn es um das komprimieren eines Makrocode geht, hast Du schon fast eine 1 verdient. Aber das ist kein Grund zum Jubeln, da sich dadurch der Code sehr schwer lesen lässt und in folge dessen die Note 1 ohne Belang, ohne Wert ist.

Code: Alles auswählen

oCellRange = oLogSheet.getCellRangeByName("A3:C260") : ocellRange.clearContents(63)
Autsch!
Geht doch einfacher.

Code: Alles auswählen

oLogSheet.getCellRangeByName("A3:C260").clearContents(63)

Klar kann man mehrere Zeilen durch den Doppelpunkt (:) in eine Zeile packen, aber das erhöht in deinem Falle überhaupt nicht die lesbarkeit.

Code: Alles auswählen

	if nSheets > 1 then : mAllSheetNames = oCollect.getsheets.elementNames() 
	for i=1 to UBound( mAllSheetNames) : oCollect.Sheets.removebyname(mAllSheetNames(i)) 
	next : 	end if : nSheets = oCollect.getsheets.count
Da verlier ich sehr schnell den Überblick, und die Lust weiter zu lesen!
Auch wenn man durch den Doppelpunkt Schleifen und Zähler -{"For ... Next" / "If ... Then"}- in eine Zeile packen kann, so ist das schwer zu lesen.
Hier mal ein Beispiel aus der Toolsammlung von AOO wie es besser aussieht.

Code: Alles auswählen

		If a <> -1 Then
			If Vartype(TargetProperties(a).Value) <> 9 Then
				If TargetProperties(a).Value <> oContent(i).Value Then
					oContent(i).Value = TargetProperties(a).Value
					bDoReplace = True
				End If
			Else
				If Not EqualUnoObjects(TargetProperties(a).Value, oContent(i).Value) Then
					oContent(i).Value = TargetProperties(a).Value
					bDoReplace = True
				End If
			End If
		End If
Da sieht man sofort auf den ersten Blick was wozu gehört. Das ist eine klare Strukrur.

Der Doppelpunkt lässt sich aber z.B. prima für mehrdimensionale Arrays nutzen.
Beispiele:

Code: Alles auswählen

btnicoArray(0,0) = "CommandButton1" : 	 btnicoArray(1,0) = "Abbruch.png"
btnicoArray(0,1) = "CommandButton3" : 	 btnicoArray(1,1) = "Korrektur.png"
Oder

Code: Alles auswählen

FaLi(0, 0) = "&H000000" : FaLi(1, 0) = "Schwarz"	 : FaLi(2, 0) = "&H000000" : FaLi(3, 0) = "Schwarz"
FaLi(0, 1) = "&H000080" : FaLi(1, 1) = "Blau"		 : FaLi(2, 1) = "&H00005A" : FaLi(3, 1) = "Blau -30%"
Was hast Du davon wenn Du deinen Code durch den Doppelpunkt so sehr komprimierst? Was bringt dir das? Warum muss das so sein?


Bei der Zelladressierung habe ich mir folgendes angewöhnt.
1.
Adressierungen die ich nicht durch eine "For ... Next", oder ähnliches, manipulieren muss, werden mit getCellRangeByName geschrieben.

2.
Adressierungen die ich mittels einer "For ... Next", oder ähnliches, manipulieren muss, werden mit getCellByPosition geschrieben. Ausnahmen bestätigen die Regel, so das auch getCellRangeByName angewendet werden kann.

3.
Nach möglichkeit werden die Variablendefinitionen für die Zelladressierungen alle am Anfang einer Sub aufgelistet.


Aber einen Pluspunkt hast Du dir dennoch verdient, und zwar für die optische Trennung der einzelnen Subs :D .

Eins kannst Du mir aber ruhig glauben, ich weiß selber wie schwer das alles ist.



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