Seite 1 von 1

einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Mi, 17.05.2017 21:58
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

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Do, 18.05.2017 14:01
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.

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: So, 21.05.2017 16:02
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

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: So, 21.05.2017 20:48
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.

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Mo, 22.05.2017 10:03
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

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Mo, 22.05.2017 11:36
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

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Mo, 22.05.2017 13:13
von little fingers
Super, vielen Dank

hat funktioniert!

Du hast mir sehr geholfen!!

cya Ingo

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Di, 23.05.2017 09:00
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

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Di, 23.05.2017 11:20
von mikeleb
Hallo,

Code: Alles auswählen

oBereich.rows.removebyindex(0,oBereich.rows.count)

Re: einen bestimmten Bereich aus einen Tabellenblatt mit datum speichern

Verfasst: Di, 23.05.2017 11:54
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!!!!!