einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

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

Moderator: Moderatoren

little fingers
***
Beiträge: 74
Registriert: Fr, 12.05.2017 15:31

einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von little fingers »

Hallo!

Ich versuche gerade aus einer mehrseitigen Calc-Datei
einen bestimmten Bereich aus einem Tabellenblatt zu zu kopieren,
diesen in eine Datei, in einem vorgegebenen Pfad, die in dem Dateinamen
auch das Datum mit Uhrzeit beinhalten sollte, zu speichern.

Nach dem Speichern sollen die kopierten Daten im Original gelöscht werden!

Tabellenblatt = Abgabe (lfd.Nummer 24 im Dokument)
Bereich ist Variabel (in der Länge) grob aber $A$12:$G$300

Ich habe schon eine Weile gesucht und mich probiert, konnte aber bis jetzt
nicht wirklich fündig werden.

Wäre echt schön, wenn man mir hier helfen könnte.

cya Ingo
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von komma4 »

Willkommen im Forum!

Welchen OpenOffice Ableger (OOo/AOO/LO) und Version nutzt Du?
little fingers hat geschrieben: Mi, 17.05.2017 21:58Ich habe schon eine Weile gesucht und mich probiert
In welcher Programmiersprache?
Zeigst Du uns Deinen Code?
Wo "hapert" es?
little fingers hat geschrieben: Mi, 17.05.2017 21:58wenn man mir hier helfen könnte
Gerne...
Du solltest uns nur beschreiben können, *wo* Du Schwierigkeiten hast - oder *was* nicht klappt.
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)
little fingers
***
Beiträge: 74
Registriert: Fr, 12.05.2017 15:31

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von little fingers »

Hallo komma4,

Vielen Dank für das herzliche Willkommen!
Und Danke für die Mühe!!
Naiv, wie ich in der Materie bin, dachte ich eigentlich, dass ich mich da gut verstanden habe :roll: ,
so wie es versucht habe zu erklären! Im Nachhinein betrachtet, musste ich feststellen, dass es schon schwierig ist,
jemanden zu erklären, was man möchte, wenn man eigentlich keine Ahnung hat.

Also Details:
Ich nutze
Libreoffice 5.2.6.2
und hier ist das "gefundene" Codegeschnipsel
Du solltest uns nur beschreiben können, *wo* Du Schwierigkeiten hast - oder *was* nicht klappt.
Ich versuche es mal.

Code: Alles auswählen

REM  *****  BASIC  *****

sub Abgabe1
' Alle Zeilen löschen, do in Zeile C keine Stellplätze definiert sind!!
' nur einmal in der Woche Leerzeilen löschen!!! (Sonntag)

oDoc = ThisComponent
oSheets = oDoc.Sheets
oSheet = oSheets.getbyName("Statistik-Abgabe")
oRows = oSheet.getRows

Goto Start

Start:
for i = 330 to 12 step -1 ' zählt rückwärts , wegen INDEX

   oCell = oSheet.getCellByPosition(2,i)
   if oCell.Value = 0 Then 
      oRows.removeByIndex(i,1)
   End if

Next i
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
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 = "Nr"
args1(0).Value = 24

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

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$Statistik-Erfassung.$A$12:$G$330" ' Bereich der erfasst werden soll'

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

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = 25	

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$A$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(5) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Flags"
args6(0).Value = "SVDNT"
args6(1).Name = "FormulaCommand"
args6(1).Value = 0
args6(2).Name = "SkipEmptyCells"
args6(2).Value = false
args6(3).Name = "Transpose"
args6(3).Value = false
args6(4).Name = "AsLink"
args6(4).Value = false
args6(5).Name = "MoveMode"
args6(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args6())

rem ------------- Speichern als CSV --------------

Dim myProps(1) as New com.sun.star.beans.PropertyValue
sPath="P:/statistik/SAbgabe.csv"
 ' Automatisch mit Datum in Dateinamen wäre hilfreich z.B. 2017-05-21_SAbgabe.csv  (wobei die Datei auch *.ods sein kann!)
sUrl=ConvertToUrl (sPath)
myProps(0).Name = "FilterName"
myProps(0).Value ="Text - txt - csv (StarCalc)"
myProps(1).Name="FilterOptions"
myProps(1).Value ="59/9,34,33,1,1/1/2/1" 'string mit den Optionen
myDoc = thisComponent
myDoc.storeAsUrl(sUrl,myProps())

End Sub
Zur Zeit ist es so, dass tatsächlich die Daten in die SAbgabe.csv übertragen werden. Wo ich hier allerdings möchte, dass automatisch das Datum Bestandteil des Dateinamens werden soll.
Ferner werden die Daten aus der "$Statistik-Erfassung.$A$12:$G$330" nach erfolgter Abgabe noch nicht gelöscht.

Vielen Dank für die Hilfe!

cya Ingo
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von mikeleb »

Hallo,
das Datumsproblem im Dateinamen lässt sich mit folgender Zeile lösen:

Code: Alles auswählen

sPfad="P:/statistik/" & format(now,"yyyy-mm-dd") & "_SAbgabe.csv"
Eine mehr direkte Art des Exports sollte mit folgendem Makro funktionieren:

Code: Alles auswählen

sub abgabe_direkt
	'Festlegen des Zeilenendezeichens
	eol=CHR$(10)
	'Textdatei vorbereiten
	oFileWrite = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
	oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
	oOutputStream.Encoding = "UTF-8"
	
	'Dateinamen erstellen
	sPfad="P:/statistik/" & format(now,"yyyy-mm-dd") & "_SAbgabe.csv"
	
	'Datei öffnen zum Schreiben
	oStream = oFileWrite.openFileWrite(sPfad)
	oOutputStream.setOutputStream(oStream)

	'Daten auslesen
	oDoc=thiscomponent
	oBereich=oDoc.Sheets.getbyName("Statistik-Abgabe").getCellRangeByName("A12:G330")
	aDaten=oBereich.getDataArray
	for i=0 to ubound(aDaten)
		if aDaten(i)(2)<>0 then 'nur Zeilen mit Zelle C ungleich Null schreiben
			oOutputStream.writestring(join(aDaten(i),";") & eol)
		end if 
	next
	'Datei schließen
	oOutputStream.closeOutput()
	'Bereich Inhalte löschen
	oBereich.clearContents(1+2+4)'gelöscht werden Zahl, Datum, String
end sub
Der Bereich A12:G330 wird zeilenweise in eine Textdatei geschrieben und anschließend gelöscht (ich nehme mal an, dass dort Zahlen, Daten, Strings stehen; Formeln würden z. B. nicht gelöscht).
Die Datei wird ohne Nachfrage erstellt und eine ggf. vorhandene Datei überschrieben.
Gruß,
mikeleb
little fingers
***
Beiträge: 74
Registriert: Fr, 12.05.2017 15:31

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von little fingers »

hi mikeleb!!

Super Danke funzt echt schon spitzenmässig!!

I´m very happy !!!

Allerdings ist in Spalte A der Abgabe die Zahl als Datum eingetragen,
kann man das auch als Datum übergeben??

Vielen Dank jetzt schon, für die bisherige Umsetzung!!

cya Ingo
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von mikeleb »

Hallo,
ergänze in der Schleife eine Code-Zeile:

Code: Alles auswählen

if aDaten(i)(2)<>0 then 'nur Zeilen mit Zelle C ungleich Null schreiben
			aDaten(i)(0)=cdate(aDaten(i)(0))
			oOutputStream.writestring(join(aDaten(i),";") & eol)
		end if
Gruß,
mikeleb
little fingers
***
Beiträge: 74
Registriert: Fr, 12.05.2017 15:31

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von little fingers »

Super, vielen Dank

hat funktioniert!

Du hast mir sehr geholfen!!

cya Ingo
little fingers
***
Beiträge: 74
Registriert: Fr, 12.05.2017 15:31

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von little fingers »

Hallo

Code: Alles auswählen

oBereich.clearContents(1+2+4)'gelöscht werden Zahl, Datum, String
Wie müsste der Befehl lauten, wenn ich die entsprechenden Zeilen
löschen möchte, nicht nur den Content?

cya Ingo
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von mikeleb »

Hallo,

Code: Alles auswählen

oBereich.rows.removebyindex(0,oBereich.rows.count)
Gruß,
mikeleb
little fingers
***
Beiträge: 74
Registriert: Fr, 12.05.2017 15:31

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Beitrag von little fingers »

Danke Dir!

Habe ich direkt eingebaut, klappt aber leider nicht!
Ziel ist es, dass die Daten, die schon außerhalb des Bereichs A12:G330
angesammelt wurden, nach oben rutschen!
Das passiert leider nicht!
Hast vielleicht noch ne andere Lösung?

cya Ingo

Sorry Klappt doch!!! Vielen, Vielen Dank!!!!!
Antworten