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

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo Balu,

danke für's Leviten lesen :roll:
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!

Hey Du! Nicht beleidigt sein! Ich habe mich bemüht Sachgerechte Kritik zu äußern, und auch Tipps gegeben. Ferner habe ich dir auch Fragen bezüglich des Doppelpunktes gestellt.

Code: Alles auswählen

'--------------------------------------------------------------------------------------------------------
		if dDateCheck >= CDateToIso(dMinDatum) and dDateCheck <= CDateToIso(dMaxDatum) then
			NamenListboxDeaktiv	
				for idd = lbound(NamA) to ubound(NamA)					
					if NamA(idd) = oLiboName.SelectedItem then				
						xx = idd			
						exit for			
					end if				
				next idd					
			iZielZeile = xx +4 ' <= Zeilennummer für getCellByPosition						
			sDate = oDatumFeld.Text						
			oZielBlatt = oDoc.Sheets().getByName(left(sDate, 2)) ' <= BlattName						
'--------------------------------------------------------------------------------------------------------
				oZielAddy = oZielBlatt.getCellRangeByName("AO" & iZielZeile +1)					
					if oZielAddy.string = "A" then						
						KopfBeschriften			
						oLabDienstS5.text = oZielBlatt.getCellRangeByName("L" & iZielZeile +1).string			
							For novisii = 14 to 15		
								oHptDialog.getControl("Label" & novisii).Visible = TRUE
							next novisii
						oHptDialog.Model.Step = 5
						goto schluss
					else				
						if oZielAddy.value > 40 then	
							KopfBeschriften		
							obe = oZielAddy.value		
								for ea = 30 to obe -11	
									oHptDialog.getControl("Label" & ea).text = oZielBlatt.getCellByPosition(ea +11, iZielZeile).string
								next ea
									oLabDienstS4.text = oZielBlatt.getCellRangeByName("BB" & iZielZeile+1).string	
								oHptDialog.Model.Step = 4							
							goto schluss
						end if			
					end if
'--------------------------------------------------------------------------------------------------------
Kopier mal den Code bei dir in eine Sub rein, und dann geh mal daher und komprimiere ihn auf deine Art mit dem Doppelpunkt. Dann schau dir mal an ob Du noch den Überblick haben kannst was zu welcher IF gehört.

Das Einrücken von Codepassagen erhöht die lesbarkeit, besonders wenns um IF....THEN oder ähnliches geht.

Aber schlußendlich musst du ja deinen Code später irgendwann einmal Warten, Pflegen oder erweitern. Und spätestens dann, wenn Du dich auf Fehlersuche begeben musst, und nach Stundenlangem Lesen schmerzende Augen hast, und die Konzentration den Bach hinunter schwimmt, dann wirst Du merken das das nicht alles so optimal ist.


Ach ja! Da war noch was!

Du willst mit der Sub SetWindowSizeX die Darstellung (Größe und Position) eines Fensters ändern? Oder sehe ich das falsch? Sorry, war bis jetzt noch zu Lustlos (Gesundheitsbedingt) deine Datei zu testen.
Wenn ich also Recht habe, mit den Ändern, dann sei gewarnt!
Denn bei solchen Sachen, die Du nicht für dich alleine auf deinen Rechner benutzen willst, wäre ich äußerst extrem Vorsichtig! Denn ein Windows-PC ist nicht gleich Windows-PC, und Linux-PC ist nicht gleich Linux-PC, da kann man ganz dolle Sachen erleben. Lies mal das hier: Unterschiedliche Dialoggrößen zwischen Linux Systemen?
Okay, da geht es um Dialoge, aber dennoch kannst du da mal erfahren wie Unterschiedlich die OOo/AOO/LO-Welten sein können. Und glaub mir, ich habe da in dem verlinktem Thread so manch graues Haar mehr bekommen und meine Nerven lagen blank!

Falls du das arber nur auf deinem PC anwenden willst, dann ist das ja alles halb so wild. Es wäre aber wohl nicht ganz so verkehrt, wenn Du dir in eine Virtuelle-Box ein Linux installierst, um auch darin Erfahrungen in StarBasic sammeln kannst.



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,
balu hat geschrieben:Hey Du! Nicht beleidigt sein!
keine Sorge bin es bestimmt nicht,
ich hatte ja schließlich explizit um Kritik gebeten und nehme die dann auch an.

Also die verschiedenen Calc-Fenster der geöffneten Dateien sollten nicht alle übereinander liegen,
exakte Positionierung ist nicht nötig, hatte ich bisher auch kein Augenmerk darauf.
die sub "SetWindowSizeX" ist scheinbar auch nicht so präzise, aber um die Fenster so in etwa zu platzieren ist es ok,
ist ja mehr Basicbasteln was ich da so mache.
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

Ok - da gibts so ein paar Stellen da frag ich mich: Was hat der Kerl vorher geraucht ??

zB.

Code: Alles auswählen

sStart = oSheet.GetCellByPosition(5,2).string : iStart = val(sStart)
sEnd = oSheet.GetCellByPosition(6,2).string : iEnd = val(sEnd)
warum zum Henker nimmst du nicht gleich ..Value aus den Zellen



in der Funktion `PickAPathAndFileName` zerlegst du per Hand in Verzeichnispfad und Dateiname irgendwo anders wird dann doch noch `FileNameoutofPath` aus der Tools-Library bemüht, warum bleibst du nicht konsequent bei einem von beiden?
Im gleichen Kontext könntest du unten in `ActivateInFront` direkt:

Code: Alles auswählen

if oDoc.Title = NeededFile then
vergleichen, ohne Umweg über ``FileNameoutofPath( oDoc.URL )``
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hi Karolus,
Karolus hat geschrieben:Was hat der Kerl vorher geraucht ??
tzz .. bin ich glücklicherweise schon ne Weile drüber hinweg :lol:

erstmal Danke für die Hinweise,
wenn man es einem denn so vor die Nase gehalten bekommt, wird schnell deutlich,
das es eher Zeilen vom späten Abend und nicht in der frischen Morgenstunde erdacht sind.

FileNameoutofPath wollte ich eigentlich überhaupt nicht verwenden,
da es ja ein Zusatz aus der Toolsammlung von Herrn Dannenhöfer ist und ich nicht weiß ob alle OO's damit installiert werden.

für oSheet.GetCellByPosition(5,2)/(6,2) hatte ich das Zellformat Text gesetzt, damit der Anwender auch ggf "001" bis "055" angeben kann

Code: Alles auswählen

sStart = oSheet.GetCellByPosition(5,2).string : iStart = val(sStart)
es ist trotzdem verbesserungsfähig in

Code: Alles auswählen

iStart = val(oSheet.GetCellByPosition(5,2).string)
Karolus hat geschrieben:m gleichen Kontext könntest du unten in `ActivateInFront` direkt:

Code: Alles auswählen
if oDoc.Title = NeededFile then
ja genauso wollte ich das auch machen, habe ich dann aber irgendwie verpennt, das laden der Tools ist jetzt auch nicht mehr nötig.
Habe direkt alles so umgesetzt, und es läuft gleich etwas flüssiger.

Danke für's drüberschauen.
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!

Sodele! Jetzt habe ich deine Datei getestet.

Code: Alles auswählen

	oCollect.store()	
	ActivateInFront(myMasterFile)
	fnCopyXSheet( sCollectName, "Import-Log" , 1)
	msgbox "done, fini, fertig, hecho, feito"
Warum speicherst Du die Sammeldatei und fügst in ihr danach noch ein Tabellenblatt ein? Dies führt zur Verwirrung, da das Makro eine Rückmeldung ausgibt das alles erledigt ist, aber beim schließen der Sammeldatei wird man gefragt ob die vorgenomenen Änderungen gespeichert werden sollen? Was zum Deibel noch mal soll das denn? Ich habe doch nix geändert? Will mich das Makro verarschen!? :twisted:

Das ist keine gute Art!

Entweder ist das Makro fertig und alles ist erledigt und man muss nix mehr speichern, oder Du gibst Auskunft darüber das die Sammeldatei noch extra gespeichert werden muss, da Du ja nach dem ersten speichern Änderungen vorgenomen hast. Oder so ähnlich.

für oSheet.GetCellByPosition(5,2)/(6,2) hatte ich das Zellformat Text gesetzt, damit der Anwender auch ggf "001" bis "055" angeben kann
Hier hättest DU dir ruhig die Mühe machen können und die richtigen Zelladressen anzugeben. So muss man erstmal nachdenken von welchen Adressen Du da redest. Ist nicht schön.

Aber davon ab, in H3 denkst Du nicht daran das ein Tabellenblatt schlicht 01 heißen kann. Denn da wird aus der Eingabe 01 schlicht 1. Und wenn man dann das Makro startet, muss man in einem Fenster jedesmal für die zu lesende Datei das gewünschte Tabellenblatt auswählen. Und da deine Anordnung der Fenster so bescheiden ist, übersieht man ganz leicht das Fenster zur Blattauswahl und man wunderst sich warum es nicht weiter geht. Das mit der Änderung von 01 auf 1 bedarf einer Überarbeitung, und zwar dringend!

ja ich wollte ein ganzes Tabellenblatt "mit Haut und Haaren" kopieren so wie es das aufgezeichnete Makro tut
Tja, mein lieber, ich glaube Du weißt wohl nicht wirklich was Du da sagst, und was das bedeutet.
Okay, durch mich hattest Du ja erfahren das so rein zufällig die DrawPage mitkopiert wird. Aber wenn Du wirklich "mit Haut und Haaren" wirklich alles meinst was dazu gehört, dann stellst Du dich vor einem schier unlösbaren Problem. Denn wenn ein Button auf der dementsprechenden Drawpage liegt, und er seine Funktion nicht verlieren darf -{weil Du ja alles willst}-, dann musst Du zusehen wie Du das dazugehörige Makro (Sub) mit kopierst. Und das möchte ich sehen wie Du das hinbekommst.

Also ein Button Beispielsweise kann durchaus ein sehr schlechter Kandidat zum kopieren sein, wenn ein Makro daran hängt. Aber ein Diagramm, welches ja auch auf der Drawpage liegt, lässt sich problemlos kopieren (zumindest bei mir hier). Und daraus folgt; Du musst dir ernsthafte Gedanken darum machen was Du wirklich kopieren möchtest/willst/kannst.

Und je nach dem was Du kopieren willst, gibt es einfache und schnelle, oder seeehr komplexe bis hin zu seeehr umfangreiche Methoden.

So einfach wie Du denkst kommst Du nicht davon. Es sei denn Du beschränkst deinen kopiermechanismus auf bestimmte Sachen, wie z.B. nur Daten und Diagramme, mehr nicht.



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
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Tabelle in andere Datei kopieren

Beitrag von Karolus »

Hallo

@Balu: lass mal die Kirche im Dorf

Der indirekte Initiator dieses Threads möchte nur (Originalzitat)
I have a folder "reports" that contains many calc files 20150401, 20150402, 20150403....(*.ods), each file has a spreadsheet called "sales".
I want to copy each spreadsheet "sales" of each file, to a unique file called "monthconsolidate.ods", with the name of the file copied .
Das Quellverzeichnis ist also bekannt, ebenso wie der Tabellenname der Tabelle die importiert werden soll.

Ohne das Boilerplate-``Arbeitsdokument`` mit den ganzen ungefragten Extrafeatures, direkt aus dem Zieldokument:

Code: Alles auswählen

import uno
from os import path
from glob import glob
from com.sun.star.sheet.SheetLinkMode import NORMAL, NONE

def import_sheet_by_Name(sheetname="sales")
    this = XSCRIPTCONTEXT.geDocument()
    sheets = this.Sheets
    folder = "/home/karolus/2015/"
    odsfiles = glob(folder + "*.ods")
    for filepath in odsfiles:
        url = uno.systemPathToFileUrl( filepath )
        tabname, _ = path.splitext( path.basename( filepath ) )
        sheets.insertNewByName( tabname, 0 )
        sheet = sheets.getByName( tabname )
        sheet.link( url, sheetname, "calc8", "", NORMAL)
        sheet.setLinkMode( NONE ) 
Damit werden 180 unübersichtliche Zeilen Basiccode durch 17 Zeilen Pythoncode ersetzt.
( ohne die LibreOffice-spezifische API -methode ..importSheet(...) zu benutzen )

Der Importtrick in den beiden letzten Zeilen ist direkt geklaut aus dem englischen Forum
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabelle in andere Datei kopieren

Beitrag von clag »

Hallo

@Balu
hier kann man prima sehen wie unterschiedlich man etwas auffassen kann
balu hat geschrieben:Will mich das Makro verarschen!?
haha nein wenn dann ich :lol:

also mein Gedanke dabei war, das man ja eigentlich nur die kopiereten Tabellenblätter braucht und die sind gespeichert,
den "Kopier-Report" guck man vielleicht an und dann geht er vermutlich sowieso in die Tonne also wozu speichern.
Diesen Geankengang hätte ich vielleicht darlegen sollen, in sofern kann ich dein "gemaule" verstehen.
Wenn da jetzt beim Anwender wirklich Interesse an dem "Report" besteht, speichert man eben etwas später (oder noch einmal).

Das beim kopieren eine Tabellenblattes einige Dinge auf der Strecke bleiben habe ich als bekannt vorrausgesetzt,
ist ja keine DDE Verbindung oder ene Vertknüpfung auf die Ursprungstabelle.

Bei H3 hat sich Zahlenformat wieder eingschlichen die Zeile3 war komplet auf Text einstellt, man müsste das dauerhaft setzen können, aber wie? Vieleich bei jedem beenden der Hauptseite die Zeile bereinigen und auf Text setzen.

@ Karolus
Karolus hat geschrieben:Ohne das Boilerplate-``Arbeitsdokument`` mit den ganzen ungefragten Extrafeatures, direkt aus dem Zieldokument:

das ist entstanden damit es etwas universeller einsetztbar ist, klar es wäre mit fest verdrahteten Namen deutlich kürzer geworden.

Und mit Python gehts noch viel kürzer wie man sieht, aber da bin ich halt noch nicht ;)
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
..aber da bin ich halt noch nicht
Du wirst auch nie dahin kommen -- weil du lieber 5 Tage rum`baselst` als fünf Minuten mit Python auseinandersetzt!
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
also mein Gedanke dabei war, das man ja eigentlich nur die kopiereten Tabellenblätter braucht und die sind gespeichert,
den "Kopier-Report" guck man vielleicht an und dann geht er vermutlich sowieso in die Tonne also wozu speichern.
Wozu hast Du denn im *TabellenblattSammler.ods* ein Blatt mit dem Namen *Import-Log*?
Also wenn Makro "fertig", dann zu der *TabellenblattSammler.ods* wechseln, das dortige Blatt *Import-Log* dem Fokus geben. Und das andere *Import-Log* in der *collection....* ist überflüssig.


Bei H3 hat sich Zahlenformat wieder eingschlichen die Zeile3 war komplet auf Text einstellt, man müsste das dauerhaft setzen können, aber wie? Vieleich bei jedem beenden der Hauptseite die Zeile bereinigen und auf Text setzen.
Eine kleine Sub schreiben, die die Zeile 3 auf das Format Text setzt. Und diese Sub dem Ereigniss: "Dokument öffnen" zuweisen, sowie im Programm immer als erstes Aufrufen.

Andere Mehode, Beispielsweise.
Erstelle einen Dialog der deine Importmaske darstellt. Und dann nimm kein Numerisches Feld, sondern ein Textfeld.

Kleine Quizfrage.
Angernommen Du hast per loadComponentFromUrl eine Datei Hidden geladen, wieviele Codezeilen brauchst Du um einen bestimmten Bereich zu kopieren?



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: Tabelle in andere Datei kopieren

Beitrag von komma4 »

clag hat geschrieben:FileNameoutofPath wollte ich eigentlich überhaupt nicht verwenden,
da es ja ein Zusatz aus der Toolsammlung von Herrn Dannenhöfer ist
Nein, die Funktion ist seit Ewigkeiten Bestandteil der Tools Bibliothek einer Standardinstallation.
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 komma4,

danke für die Klarstellung, da habe ich wohl das Gelesene irgendwie falsch interpretiert.
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 zusammen,

hier eine etwas veränderte Version,
in der die meisten der vorgenannten Kritikpunkte überarbeitet sind.
TabellenblattSammler_r2a.ods
(19.13 KiB) 155-mal heruntergeladen
hoffe diese Version ist für den einen oder anderen nützlich.

edit:
der Basic Speicherteufel hatte zugeschlagen und die letzten Änderungen mal wieder nicht gespeichert.
Habe darum die Datei noch einmal ausgetauscht, nun ..r2a.ods
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten