Seite 1 von 1

Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Mo 12. Dez 2016, 22:03
von Dieter13
'tach allerseits ;)

Ich habe hier:
»» ein Tabellenblatt mit Anschriften, sonst. Daten, etc.
»» ein zweites Tabellenblatt auf dem ich sowohl verknüpfte Daten von Blatt1 als auch zusätzliche Daten habe

Ich möchte gerne (dafür habe ich Blatt2 angelegt)
»» den 'belegten' (oder benutzten) Bereich von Blatt 2 als CSV exportieren
»» und zwar nur diesen exportieren

Hintergrund:
  • o Ich habe hier eine Tabelle (als Übersicht), auf der Adressdaten, Bemerkungen, Tel.Nrn. etc. erfasst sind.
    o Derzeit stehen hier ~17 Adressdaten (==Zeilen) drauf, es können aber auch 40--50 werden.
    o Ich möchte die Daten gerne auf einer Webseite anzeigen, halte eine SQL-Datenbank hier aber für übertrieben.
    o Ich könnte die Daten (getestet!) per [COPY]+[PASTE] nach 'Kate' (unter Linux) importieren und die [TABs]
    dann durch ';' ersetzen lassen.
    o Da sich die Anzahl der Adressen auch verändern kann (mehr/weniger), oder Änderungen einzupflegen sind,
    könnte das an manchen Tagen etwas 'mühsam' werden
    o ...
Meine Frage(n) an Euch:
»» kann 'man' (nur) einen Bereich eines Tabellenblattes als CSV exportieren?
»» kennt einer von Euch ein 'AddOn' oder hat das schon mal per Makro gelöst?
»» habt Ihr vielleicht eine Lösung z.B. für einen Button der (per Makro) einen markierten Bereich exportiert?

Ich bin für jede Lösung/Anregung dankbar :D .

Re: Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Di 13. Dez 2016, 20:23
von Dream-Teacher
Hi Dieter,

ggf. wäre eine Beispieldatei gut.

--> Aber mal ne ganz blöde Frage von mir: Warum kopierst Du das, was Du in die CSV exportieren möchtest nicht einfach und fügst es in eine neu Arbeitsmappe wieder ein? Von dort aus könntest Du dann doch Deine gewünschten Daten in die CSV-Datei exportieren.

Herzliche Grüße

D-T

Re: Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Di 13. Dez 2016, 20:47
von Dieter13
Hallo D-T!
Hi @ all!

Danke erstmal für die Antwort.

Den von Dir beschriebenen Weg habe ich gestern auch getestet, nachdem weitere Recherchen nur zu einem Makro von !2007! führte.
(http://www.ozgrid.com/forum/showthread.php?t=76720).

Klar (wie beschrieben) ich kann (unter Linux) den Umweg über kate gehen oder (unter Windows) über Notepad++.
Etwas eleganter ist der Weg über eine zusätzliche Calc-Datei.csv ... aber immer noch ein Umweg, daher hier die Frage(n) :oops:

Ich wunderte mich darüber dass es keinen direkten Export gibt für einen markierten oder definierten Bereich.
Da dürften (so meine Annahme) doch mehr Leute Bedarf haben, wenn sie LO/OO/EX$$$-Dateien bekommen und diese dann z.B. für eine Datenbank in CSV umwandeln müssen.

Wie gesagt, das wird keine riesige Sache ... daher kann ich mit den o.g. Behelfen (gut) leben. 8-)

Vielleicht fällte dem einen/anderen ja noch was dazu ein :mrgreen:

Danke für's lesen!

Re: Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Di 13. Dez 2016, 22:39
von craig
Hallo Dieter,

hier ein Makro mit dem Du eine reine Textdatei erstellen kannst.

Markiere dazu einen Datenbereich in einer Tabelle und starte das Makro.
Zuvor musst noch die Pfadangabe im Makro anpassen.
Ist im Makro kommentiert.

Code: Alles auswählen

Sub Textdatei
Dim oDoc as Object
Dim oSheet as Object
Dim mArr as Variant
	oDoc =thiscomponent
		' Tabelle mit dem Index 0
		oSheet =oDoc.Sheets().getByindex(0)
		' ODER per Name
'		oSheet =oDoc.Sheets().getByName("Tabelle1")		
		
			' aktuelle Selektion einlesen
			oSel=oDoc.CurrentSelection

		' Daten aus Selektion in Array schreiben
		mArr=osel.getDataArray()

	i = FreeFile()
	
REM >>>> Hier die Pfadangabe anpassen <<<<
	Open "c:\Temp\_text01.txt" For Output As i
	
	' Array-Untergrenze bis -Obergrenze durchzählen
	for k=lbound(mar()) to ubound(mar())
					' Array Spalte 0 - 2 schreiben
		   print #i, mArr(k)(0) & "," &  mArr(k)(1) & "," & mArr(k)(2)
	next

   Close #1
End Sub
Es ließe sich auch ein fester Datenbereich zuweisen,
oder es öffnet sich eine Inputbox, in der dann der zu
schreibende Adressbereich eingetragen wird.

Bei einer CSV-Datei müssen jedoch noch ein paar Eingeschaften übergeben werden.
Hier für einen Windows-Rechner:

Code: Alles auswählen

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/temp/Unbenannt%202.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true,false"
Wie ich dies jetzt mit dem oberen Code verketten könnte weiß ich im Augenblick nicht.
Muss ich selbst erst herausfinden.

Ich hoffe mein Beitrag hilft Dir ein Stück weiter.

Re: Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Mi 14. Dez 2016, 21:58
von Dieter13
Hallo craig,

hi @ ALL
craig hat geschrieben:Hallo Dieter,

hier ein Makro mit dem Du eine reine Textdatei erstellen kannst.

Markiere dazu einen Datenbereich in einer Tabelle und starte das Makro.
Zuvor musst noch die Pfadangabe im Makro anpassen.
Ist im Makro kommentiert.
Super! DANKE! ich versuche gerade 'mein' (also DEIN) erstes Makro unterzubringen :P
Immerhin habe ich es schon geschafft einen Button auf dem Blatt anzulegen!! :o
Den Rest schaffe ich dann auch noch ... :? hoffe ich.

Code: Alles auswählen

Sub Textdatei
Dim oDoc as Object
Dim oSheet as Object
Dim mArr as Variant
	oDoc =thiscomponent
		' Tabelle mit dem Index 0
		oSheet =oDoc.Sheets().getByindex(0)
		' ODER per Name
'		oSheet =oDoc.Sheets().getByName("Tabelle1")		
		
			' aktuelle Selektion einlesen
			oSel=oDoc.CurrentSelection

		' Daten aus Selektion in Array schreiben
		mArr=osel.getDataArray()

	i = FreeFile()
	
REM >>>> Hier die Pfadangabe anpassen <<<<
	Open "c:\Temp\_text01.txt" For Output As i
	
	' Array-Untergrenze bis -Obergrenze durchzählen
	for k=lbound(mar()) to ubound(mar())
					' Array Spalte 0 - 2 schreiben
		   print #i, mArr(k)(0) & "," &  mArr(k)(1) & "," & mArr(k)(2)
	next

   Close #1
End Sub
Es ließe sich auch ein fester Datenbereich zuweisen,
oder es öffnet sich eine Inputbox, in der dann der zu
schreibende Adressbereich eingetragen wird.
IMHO reicht es den markierten Bereich zu übertragen.
Ist für User wie meinereiner am einfachsten.
Falls da Konfigurations-Optionen im Makro möglich sein sollten,
finden die Power-User bestimmt heraus, was sie damit anfangen können! :ugeek:

Bei einer CSV-Datei müssen jedoch noch ein paar Eingeschaften übergeben werden.
Hier für einen Windows-Rechner:

Code: Alles auswählen

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/temp/Unbenannt%202.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true,false"
Wie ich dies jetzt mit dem oberen Code verketten könnte weiß ich im Augenblick nicht.
Muss ich selbst erst herausfinden.
Um ganz ehrlich zu sein: Ich verstehe überhaupt nicht was im Makro und im
restlichen code passiert :oops: Lediglich bei Dingen wie C:\ oder REM kann
ich Dir folgen :lol:

Ich hoffe mein Beitrag hilft Dir ein Stück weiter.
Bestimmt. Und wenn Du den Rest auch herausgefunden hast, werden
RUHM UND EHRE auf Dich herabfallen!
Im Ernst(!) ... DANKE dafür dass Du mein Problem zu Deinem machst und versuchst
es zu lösen!
Danke für Deine Zeit!

Re: Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Mi 14. Dez 2016, 23:41
von craig
Hallo Dieter,

wenn Du Dich mit der Thematik des Programmierens auseinandersetzen möchtest, kann
ich Dir folgende Seiten und Dokus zur Basic-Programmierung empfehlen.

https://www.uni-due.de/~abi070/count.ph ... eutsch.pdf
http://www.starbasicfaq.de/index.html

Libreoffice Handbücher.
Ganz unten auf der Seite befindet sich auch ein Handbuch zur Makro-Programmierung.
https://de.libreoffice.org/get-help/documentation/

Eine unverzichtbare Extension für die Code-Analyse und sonstige Inspection.
MRI Extension
MRI Online Doku

Um dies noch zu erwähnen:
Man kann zur Programmierung auch z.B. die Sprachen C++, Java, Python benutzen.

Ich bleibe hier bei der Erklärung für Code-Sprache Basic.
Dieter hat geschrieben:Immerhin habe ich es schon geschafft einen Button auf dem Blatt anzulegen!!
Den Rest schaffe ich dann auch noch ... hoffe ich.
Hast Du es geschafft?
Dieter hat geschrieben:IMHO reicht es den markierten Bereich zu übertragen.
Ist für User wie meinereiner am einfachsten.
Falls da Konfigurations-Optionen im Makro möglich sein sollten,
finden die Power-User bestimmt heraus, was sie damit anfangen können!
Lese meine Kommentare im Code, dort steht dieses:

Code: Alles auswählen

' aktuelle Selektion einlesen
oSel=oDoc.CurrentSelection 
Die Variable oSel enthält ALLES was in der aktuellen Selektion/ Markierung
enthalten ist. Daten, Formatierungen, Zelladressen usw.

Hiermit hole ich nur die Daten aus dem markierten Bereich (oSel) und
schreibe die Daten in ein Array:

Code: Alles auswählen

' Daten aus Selektion in Array schreiben
mArr=osel.getDataArray() 
Ein Array ist im Prinzip eine Abbildung der Tabelle.
Es sind Zeilen (Datensätze) und Felder (Spalten) enthalten.
Schreibe in Zelle A1:A3 die Zahlen 1;2;3.
Markiere die Zellen A1:A3 und führe das Makro aus, dann sind im Array folgende Daten enthalten.
Arrayadresse 0,0 =1
Arrayadresse 1,0 =2
Arrayadresse 2,0 =3

Schreibe in Zelle A1:A3 die Zahlen 1;2;3.
Schreibe in Zelle B1:B3 die Zahlen 10;20;30.
Markiere die Zellen A1:B3 und führe das Makro aus,
dann sind im Array folgende Daten enthalten.
Arrayadresse 0,0 =1
Arrayadresse 0,1 =10
Arrayadresse 1,0 =2
Arrayadresse 1,1 =20
Arrayadresse 2,0 =3
Arrayadresse 2,1 =30

Übersetzt heißt dies:
Datensatz 1 in Spalte 1 = 1
Datensatz 1 in Spalte 2 = 10
Datensatz 2 in Spalte 1 = 2
Datensatz 2 in Spalte 2 = 20
Datensatz 3 in Spalte 1 = 3
Datensatz 3 in Spalte 2 = 30

Ist ja ganz prima das ich dies schreibe. Aber woher sollst Du
wissen wie man den Inhalt eines Arrays inspiziert :mrgreen:

Code: Alles auswählen


      ' Daten aus Selektion in Array schreiben
      mArr=osel.getDataArray()

' Print "Hallo Stop mich"

  • Markieren eine Tabellenbereich.
  • Füge nachfolgende Zeile, unterhalb von "mArr=osel.getDataArray()" in den Code ein.
    Print "Hallo Stop mich"
  • Direkt neben dem Fenster des Modulblattes in der IDE, siehst
    Du eine graue Spalte.
  • Dort klickst Du mit der Maus vor die gerade eingefügte Zeile.
    Es wird Dir nun ein roter Punkt angezeigt.
    Dieses ist eine Stoppmarke. Der Code wird genau hier unterbochen.
  • Stelle nun den Cursor in das Wort/ den Arraynamen (mArr).
  • Drücke die Taste F7.
  • Jetzt siehst Du unten links im Beobachterfenster den Arraynamen.
  • Starte das Makro. Im Beobachterfenster kannst Du nun auf die +
    klicken, um die einzelnen Array-Felder auf ihren Inhalt zu püfen.
Voll easy, oder? :mrgreen:

Code: Alles auswählen

rem ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/temp/Unbenannt%202.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true,false"
Dieser Codeabschnitt enthält auch ein Array. Es wird aber nicht mit Daten
aus der Tabelle erzeugt, sondern im Code werden dem Array Daten übergeben.
Es handelt sich hierbei um zuweisbare Eigenschaften an ein Objekt.
Die Eigenschaften kann man auch als Parameter oder Argumente bezeichnen.
Im Code wird die Abkürzung für Argumente (args) verwendet.

Hiermit wird ein Array mit 3 Felder erzeugt, welches später die Daten
der Eigenschaften aufnehmen soll.
3 Felder? Ja :!:
Die Zählung eines Arrays beginnt für gewöhnlich bei 0.
Somit 0,1,2 = 3 Felder.

Der Vorteil bei Arrays ist, man kann den gesamten Inhalt am Block an ein weiteres Objekt übergeben.

Mit dieser Anweisung kann mein den kompletten Inhalt eines Arrays zurück in die Tabelle schreiben:

Code: Alles auswählen

oSheet.getCellRangeByPosition(StartSpalte,StartZeile,EndSpalte,EndZeile).setDataArray(meinArrayName)
So kann auch „args1“ dazu verwendet werden, alle Parameter beim Schreiben einer Datei an ein Stück zu übergeben.
  1. Pfadangabe und Dateiname.
  2. Welcher Dateifilter wird verwendet.
  3. Spezielle Parameter für die CSV-Datei.
Ein Kommentar im Code wird durch eine REM oder ein Hochkomma vor der Zeile/ dem Text gekennzeichnet.

Habe noch kein Beispiel gefunden, mit dem man aus einer Selektion
von Daten ein CSV-File erstellen kann.
Ggf. muss hier ein kleiner Umweg gegangen werden:
  1. Zellen markieren und kopieren
  2. Ein neues Blatt anlegen
  3. Daten einfügen
  4. Das neue Blatt als CSV-File speichern
  5. Das neue Blatt(nicht die Datei) löschen.

Re: Nur (Teil-)Bereich eines Tabellenblattes als csv exportieren

Verfasst: Do 15. Dez 2016, 00:04
von Wanderer
Hallo,
Dieter13 hat geschrieben: Meine Frage(n) an Euch:
»» kann 'man' (nur) einen Bereich eines Tabellenblattes als CSV exportieren?
...
Ich bin für jede Lösung/Anregung dankbar :D .
Ohne Macro würde ich versuchen die gewünschten Zeilen per Spezialfilter auf ein weiteres Blatt zu schreiben
und dann dieses Blatt als .csv speichern. Dabei kannst Du dann auch das Trennzeichen festlegen.
(Macros sind natürlich toll, aber manchmal will ich einfach keine erlauben...)

mfg, Jörn