torsdag den 6. oktober 2016

Mere regnearks-gymnastik (makro)

Vi vil gerne lidt mere end bare løbe rundt i cellerne. I denne omgang skal vi se hvordan vi kan hente data fra en CSV-fil.

Filen er en simpel fil med to kolonner:


Det er såmænd en statistik over hvor mange der abonnerer på nyhedsbrevet.


Først skal vi have defineret nogle variable:

Den fil jeg gerne vil importere:
filename= "file:///home/leif/Skrivebord/Calc/Statistik.csv"

Som sædvanligt dokumentet:
my_doc = ThisComponent

Og vi skal have styr på arkene i dokumentet:
my_sheets = my_doc.Sheets
antal=my_sheets.count


Nu skal vi lige undersøge om vores ark allerede findes, eller om vi skal oprette et nyt. Baggrunden er at jeg gerne vil sikre at jeg ikke overskriver vigtige data andre steder i mit regneark.

Kort fortalt, så opretter jeg arket "Statistik", hvis ikke det findes i forvejen:
If NOT my_sheets.hasbyName("Statistik") Then
my_sheets.insertNewByName("Statistik", antal)
End If
the_sheet = my_sheets.getByName("Statistik")


Når vi indlæser CSV-filen skal vi bruge nogle "magiske" import-parametre. For at gøre en lang historie kort, så svarer filter_valg til de valg du kan gøre i import-dialogen i LibreOffice:
filter = "Text - txt - csv (StarCalc)"
filter_valg = "44,34,0,1,1/2/2/1/3/2"
tilstand = com.sun.star.sheet.SheetLinkMode.NORMAL


Her kommer så den egentlige import:
the_sheet.link(filename, "", filter, filter_valg, tilstand)

Hvis du IKKE ønsker at data skal indsættes som kæde, kan du tilføje denne linje:
the_sheet.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)

Makroen, som faktisk ikke er særlig stor, ser sådan ud:

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

Sub ImportCSV
filename= "file:///home/leif/Skrivebord/Calc/Statistik.csv"
my_doc = ThisComponent
my_sheets = my_doc.Sheets
antal=my_sheets.count

If NOT my_sheets.hasbyName("Statistik") Then
my_sheets.insertNewByName("Statistik", antal)
End If

the_sheet = my_sheets.getByName("Statistik")

filter = "Text - txt - csv (StarCalc)"
filter_valg = "44,34,0,1,1/2/2/1/3/2"
tilstand = com.sun.star.sheet.SheetLinkMode.NORMAL

the_sheet.link(filename, "", filter, filter_valg, tilstand)
the_sheet.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)

End Sub