søndag den 16. oktober 2016

Filnavne i makroer

I artklen hvor vi indlæste data fra CSV-filen brugte jeg denne linje:
filename= "file:///home/leif/Skrivebord/Calc/Statistik.csv"

Det er på baggrund af min PC, som kører Linux, hvor jeg har lagt filen Statistik.csv i mappen Calc på skrivebordet. Den fysiske adresse er "/home/leif/Skrivebord/Calc/Statistik.csv".

På en Windowsmaskine kunne placeringen f.eks. være "c:\My Documents"

Læg mærke til at skråstregerne vender den anden vej på Windows i forhold til Linux.

Men læg også mærke til at når den fysiske adresse er /home/leif/Skrivebord/Calc/Statistik.csv så skal makroen kende den som file:///home/leif/Skrivebord/Calc/Statistik.csv. Det er fordi makroen skal bruge filplaceringen som var det en URL. Heldigvis kan vi konvertere en fysisk adresse til URL og omvendt

Sub ToFromURL
  Print ConvertToURL("/home/leif/Skrivebord/Calc/Statistik.csv")    'file:///home/leif/Skrivebord/Calc/Statistik.csv
  Print ConvertFromURL("file:///home/leif/Skrivebord/Calc/Statistik.csv") '/home/leif/Skrivebord/Calc/Statistik.csv
  Print ConvertToURL("c:\My Documents")               'file://c:/My%20Documents
  Print ConvertFromURL("file://c:/My%20Documents")    'c:\My Documents
End Sub


Når du skal vise en sti for brugeren skal du konvertere med ConvertFromURL
Når du skal bede brugeren om input, skal du efterfølgende konvertere med ConvertToURL for at LibreOffice forstår det.

Hvis du skal beregne en placering, som skal kunne anvendes på både Windows og Linux, så skal du aldrig anvende / eller \ i din beregning. Brug i stedet funktionen GetPathSeparator() som adskiller. På den måde får du returneret det rigtige tegn.

Sub filepath
sPathToFile = "C:\temp"
sCSVName   = "Statistik.csv"
sPathToCSV = sPathToFile & GetPathSeparator() & sCSVName

End sub

Vi kan få nogle brugbare informationer ud af makroen:
CurDir([s$])    '/home/leif
thisComponent.url 'file:///home/leif/Skrivebord/Calc/MakroTest.ods


Der er en række miljøvariabler som vi kan aflæse direkte. Det er:
$(inst): LibreOffice programmet rod
$(prog): LibreOffice programmet
$(user): Brugerkataloget (indstillinger osv.)
$(work): Brugerens arbejdsbibliotek, f.eks."MyDocuments"
$(home): Brugerens hjemmekatalog, f.eks. "Documents and Settings"
$(temp): Det aktuelle midlertidige bibliotek
$(path): Væ:rdien af miljøvatiablen PATH
$(langid): Sprogkode, f.eks. 1030 for dansk
$(vlang): Sprog, f.eks. "da"

Dem kan du aflæse sådan:
oPathSubst = createUnoService("com.sun.star.util.PathSubstitution")
Print oPathSubst.getSubstituteVariableValue("$(home)")


Her er et eksempel, hvor jeg beregner filsti og navn for min CSV-fil:

Sub FilePath
oPathSubst = createUnoService("com.sun.star.util.PathSubstitution")
homepath =  oPathSubst.getSubstituteVariableValue("$(home)")
file= homepath + GetPathSeparator() + "Skrivebord"+ GetPathSeparator() +"Calc"+ GetPathSeparator() +"Statistik.csv"
print file
End sub