Seite 1 von 1

[GELÖST] *.csv von Bank importieren

Verfasst: Di 3. Mai 2022, 22:04
von Ich Bins
Hallo zusammen,

zwei Jahre lang konnte ich mit dem Makro aus diesem thread
viewtopic.php?f=12&t=25465
die csv-Dateien meiner Bank importieren. Im Februar 2022 änderte die Bank
das Format der Dateien. Die Anpassung des Makros war relativ einfach.
Die Bank hat nun schon wieder eine Änderung gemacht und ich muss schon
wieder das Makro anpassen. Die Umlaute und das ß werden falsch dargestellt.
Öffne ich manuell die Datei werden die Umlaute und das ß richtig dargestellt.
Ich gehe davon aus, dass in der Zeile

Code: Alles auswählen

	args(2).Value = "59,34,0,1,2/4/3/4,0,false,true,true"
in nachfolgendem Code eine Änderung nötig.

Wo kann ich eine Beschreibung der Filteroptionen finden, meine Suche danach
war leider erfolglos.

Anbei ist eine csv-Beispieldatei mit zwei Zeilen in der sich ein Umlaut befindet.

Viele Grüße
ich Bins

Code: Alles auswählen

Sub CSV_Import()

	'Kontodatei.ods als Objekt in Variable schreiben
	oKontoDoc = ThisComponent
	'Dateiauswahl-Dialog erzeugen
	oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
	oFilePicker.setMultiSelectionMode(False)
	'Filter für die Dateiauswahl initialisieren
	oFilePicker.appendFilter("Alle Dateien", "*.*") 	
	oFilePicker.appendFilter("csv - Dateien", "*.csv")
	'Filter für cvs-Dateien aktivieren
	oFilePicker.setCurrentFilter("csv - Dateien")
	'Dialog aufrufen und auswerten
	if oFilePicker.execute()=1 then 'wenn nicht abgebrochen
		'Auslesen der gewählten Datei
		oFiles= oFilePicker.getFiles() 'url der datei
		'Setzen der Importoptionen
		sFileURL=oFiles(0)
		Dim Args(2) as New com.sun.star.beans.PropertyValue
		args(1).Name = "FilterName"
		args(1).Value = "Text - txt - csv (StarCalc)"
		args(2).Name = "FilterOptions"
		args(2).Value = "59,34,0,1,2/4/3/4,0,false,true,true"
		'Öffnen des Dokuments
	    oImportDoc = StarDesktop.loadComponentFromURL(sFileURL,"_blank", 0, Args())
	end if

'   Isoliert die Jahreszahl aus dem Dateinamen
	varArbeitsblatt = Mid(oImportDoc.Title, 33, 4)
'	Zugriff auf das 1. Tabellenblatt
	oExtCSVBlatt = oImportDoc.Sheets(0)
'   Erste Zeilen löschen: Index und Anzahl
'    myrows=oExtCSVBlatt.getrows
'    myrows.removebyindex(0,15)
'   letzte Zelle des Bereiches
	ocursor = oExtCSVBlatt.createCursor()
	ocursor.gotoStart()	
	ocursor.gotoEndofUsedArea(false)			
'   index letzte Spalte des Bereichs
'    varLetzteSpalte = ocursor.getRangeAddress.endColumn
'   index letzte Zeile des Bereichs
	varLetzteZeile = ocursor.getRangeAddress.endRow
'   letzt drei Zeilen löschen	  
    myrows.removebyindex(varLetzteZeile - 2,varLetzteZeile)
	oExtCSVSpalte=oExtCSVBlatt.getColumns

'	Zugriff auf das 1. Tabellenblatt
	oSheet = oImportDoc.Sheets(0)
	myColumn=oSheet.getColumns
	'Quell- und Zielspalten für Verschiebung
	aQuelle=array("E","M","N","I","B")
    aZiel=array("D","E","F","H","L")
	'Kopieren
	for i=0 to ubound(aQuelle)
		oQuelleRange=mycolumn.getByName(aQuelle(i))
		oQuellRangeAddresse = oQuelleRange.getRangeAddress
		oZiel = mycolumn.getByName(aZiel(i)).getCellByPosition(0,0)
		oZielCellAdresse=oZiel.getCellAddress
		oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
	next
	'Spalten leeren
'	mycolumn.getByName("E").ClearContents(1023)
	mycolumn.getByName("I").ClearContents(1023)
'   Spalte BLZ und Währung löschen
    myColumn.removeByIndex(13,1)
    myColumn.removeByIndex(12,1)
    myColumn.removeByIndex(1,1)    
	'neue Spaltenüberschriften
	oSheet.getCellByPosition(1,0).string="Vorgang"
	oSheet.getCellByPosition(2,0).string="Buchungstext"
	oSheet.getCellByPosition(3,0).string="Betrag"
	oSheet.getCellByPosition(4,0).string="S-H"
	oSheet.getCellByPosition(5,0).string="IBAN/Kontonummer"
	oSheet.getCellByPosition(6,0).string="BIC/BLZ"
	oSheet.getCellByPosition(7,0).string="Saldo"
	oSheet.getCellByPosition(8,0).string="Verwendungszweck"
'   Spaltenüberschrift fett formatieren
	oRange = oSheet.getCellRangeByName("A1:K1")
  	oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD
'   Spaltenbreite optimieren
	oSheet.Columns(0).OptimalWidth = True
	oSheet.Columns(1).OptimalWidth = True	
	oSheet.Columns(2).OptimalWidth = True	
	oSheet.Columns(3).OptimalWidth = True	
	oSheet.Columns(4).OptimalWidth = True	
	oSheet.Columns(5).OptimalWidth = True	
	oSheet.Columns(6).OptimalWidth = True
	oSheet.Columns(7).OptimalWidth = True	
        oSheet.Columns(8).Width = 4000
	oSheet.Columns(9).OptimalWidth = True	
'   Reihenfolge vertauschen
	oCellCursor = oSheet.createCursor
        oCellCursor.GotoEndOfUsedArea(False)
    oBereich=oSheet.getCellRangeByPosition(0,1,oCellCursor.getRangeAddress().endColumn,oCellCursor.getRangeAddress().endRow)
    'Zellinhalt in Array lesen
    aDaten()=oBereich.getDataArray
    'Zeilen- und Spaltenanzahl merken
    zeilen=ubound(aDaten())
    spalten=ubound(aDaten(0))
    'Zeilen vertauschen
    for i=0 to zeilen/2
		tmp=aDaten(zeilen-i)
		aDaten(zeilen-i)=aDaten(i)
		aDaten(i)=tmp
    next
'   ab hier stehen die aufbereiteten Daten zur Verfügung
'   letzte nicht leere Zeile in der Kontodatei ermitteln

'------andere Variablenbezeichnung wählen, oSheet bleibt für die csv
	oZiel = oKontoDoc.Sheets().getByName(varArbeitsblatt)
	ocursor = oZiel.createCursor()
	ocursor.gotoStart()	
'------------------------------------------	
'   letzte Zelle des Bereiches
	ocursor.gotoEndofUsedArea(false)
'   letzte Zeile des Bereichs	
	varEinfuegezeile = ocursor.getRangeAddress.endRow + 3
'   Bereich zum Einfügen festlegen
'	Der Bereich muss dieselbe Größe haben, wie der Ursprungsbereich!
    oZielBereich = oZiel.getCellRangeByPosition(3,varEinfuegezeile,3+spalten,varEinfuegezeile+zeilen)
'   Test ob das Auswählen der Zelle korrekt war
'	mycell.string = "Probe"
'   die nächste Zeile fügt die gedrehten Daten in die csv-Datei ein   
	oZielBereich.setDataArray(aDaten)
'   csv-Datei schließen
	oImportDoc.close(false)
End Sub

Re: *.csv von Bank importieren

Verfasst: Di 3. Mai 2022, 23:37
von mikele
Hallo,
du wirst den richtigen Zeichensatz (UTF-8 oder so ...) auswählen müssen.
https://help.libreoffice.org/latest/de/ ... PAR=SHARED

Re: *.csv von Bank importieren

Verfasst: Mi 4. Mai 2022, 08:47
von Ich Bins
Hallo mikele,

die Problemlösung war

Character Set Codes for Token 3
für Unicode (UTF-8) = 76

Code: Alles auswählen

args(2).Value = "59,34,76,1,2/4/3/4,0,false,true,true"
Ich danke Dir für Deine Hilfe.

Viele Grüße
Ich Bins