Makrá v OpenOffice.org: Vkladanie dátumu a času podľa vlastného formátu (2)

Július Pastierik  /  13. 04. 2011, 00:00

V druhom pokračovaní si ukážeme funkcie, pomocou ktorých dokážete vkladať dátum a čas podľa pevne určených formátov.

Pretože dátumy potrebujeme do dokumentov vkladať v rôznych formátoch, pripravíme si niekoľko funkcií, kde si ich formát nastavíme pevne.

REM Makro pre vloženie reťazca na aktuálnu pozíciu kurzora v textovom dokumente
sub vloz_do_dokumentu (retazec as string)
 dim dokument as object
 dim teraz as string
 dim tabulka as boolean
 dokument=ThisComponent.currentcontroller.getViewCursor() ' Aktuálna pozícia kurzora
 tabulka= not IsEmpty(dokument.Cell) ' Identifikácia, či je kurzor v textovej tabuľke
 if tabulka Then ' Sme v tabuľke
  dokument=dokument.cell
 else
  dokument.collapseToEnd() ' Presun na koniec a zrušenie označenia, ak je označený text
 endif
 teraz=dokument.getstring() ' Text na konci kurzora
 dokument.setstring(teraz+retazec) ' K textu pridáme dátum
 if not tabulka then
  dokument.collapseToEnd() ' Presun na koniec vloženého dátumu
 endif
end sub

REM Makro pre vloženie aktuálneho dátumu na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum
 dim dokument, bunka as object
 dim teraz, datum, cas as string
 dim i as integer
 teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
 i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
 datum=left(teraz,i-1) ' Dátum
 if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then ' Ak sme v tabuľkovom procesore
  ' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
  dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
  bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
  bunka.value=datevalue(datum) ' Vloženie dátumu ako hodnoty
 endif
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then ' Ak sme v textovom dokumente
  ' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
  vloz_do_dokumentu(datum)
 endif
end sub

REM Makro pre vloženie aktuálneho dátumu ako text s medzerami na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum_text
 dim dokument, bunka as object
 dim teraz, datum, cas as string
 dim dd, mm, rr as string
 dim i as integer
 teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
 i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
 datum=left(teraz,i-1) ' Dátum
 ' Dátum je v tvare dd.mm.rrrr, z toho vytvoríme dd. mm. rrrr – medzi čísla vložíme nezalomiteľné medzery
 dd=left(datum,3)
 mm=mid(datum,4,3)
 rr=right(datum,len(datum)-6)
 datum=dd+chr$(&HA0)+mm+chr$(&HA0)+rr
 if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then ' Ak sme v tabuľkovom procesore
  ' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
  dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
  bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
  bunka.string=datum ' Vloženie dátumu ako reťazca
 endif
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then ' Ak sme v textovom dokumente
  ' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
  vloz_do_dokumentu(datum)
 endif
end sub

REM Makro pre vloženie aktuálneho času na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Cas
 dim dokument, bunka as object
 dim teraz, datum, cas as string
 dim i as integer
 teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
 i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
 cas=right(teraz,len(teraz)-i) ' Čas
 if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
  ' Funkcia vloží čas do aktuálnej bunky zošitu v Calcu
  dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
  bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
  bunka.value=timevalue(cas) ' Vloženie času ako hodnoty
 endif
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
  ' Funkcia vloží čas na aktuálnu pozíciu vo Writeri
  vloz_do_dokumentu(cas)
 endif
end sub

REM Načítanie názvu mesiaca zo súboru
function Mesiac_zo_suboru(m_datum as integer, zaklad_tvar as boolean, jazyk as string) as string
dim mesiac(12), mesiaca(12) as string
 dim mm as string
 dim riadok, definicia as string
 dim rovna, cc as integer ' číslo mesiaca
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
 
 REM Pokiaľ nebude definovaný jazykový súbor, budú sa vkladať slovenské mesiace
 mesiac(1)="január"
 mesiac(2)="február"
 mesiac(3)="marec"
 mesiac(4)="apríl"
 mesiac(5)="máj"
 mesiac(6)="jún"
 mesiac(7)="júl"
 mesiac(8)="august"
 mesiac(9)="september"
 mesiac(10)="október"
 mesiac(11)="november"
 mesiac(12)="december"
 
 mesiaca(1)="januára"
 mesiaca(2)="februára"
 mesiaca(3)="marca"
 mesiaca(4)="apríla"
 mesiaca(5)="mája"
 mesiaca(6)="júna"
 mesiaca(7)="júla"
 mesiaca(8)="augusta"
 mesiaca(9)="septembra"
 mesiaca(10)="októbra"
 mesiaca(11)="novembra"
 mesiaca(12)="decembra"
 if jazyk<>"sk" then
  REM Načítanie názvov mesiacov z lokalizačných súborov
  on error resume next
  kde=basiclibraries.getLibraryLinkURL("JP_date_time") ' Adresár, kde je rozšírenie nainštalované
  sNazov=left(kde,len(kde)-10)+"JP_date_"+jazyk+".txt" ' Súbor s jazykovou lokalizáciou
  if fileexists(sNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
   sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
   inStream = sf.openFileRead(sNazov)
   inFile = createUnoService("com.sun.star.io.TextInputStream")
   inFile.InputStream = inStream
   inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
  
   Do While not inFile.IsEOF
    riadok = trim(inFile.readLine) ' namiesto Line Input #subor, riadok
    rovna=instr(riadok,"=")
    if rovna<>0 then
     mm=left(riadok,1)
     cc=val(mid(riadok,2,2))
     definicia=trim(right(riadok,len(riadok)-rovna))
     if mm="m" and cc>=1 and cc<=12 then ' mm = m – mesiac, a – mesiaca
      mesiac(cc)=definicia
     end if
     if mm="a" and cc>=1 and cc<=12 then ' mm = m – mesiac, a – mesiaca
      mesiaca(cc)=definicia
     end if
    end if
   loop
   ' Zatvorenie definičného súboru – namiesto close #subor
   inStream.closeInput
   inFile.closeInput
  end if
 end if
 if zaklad_tvar then
  Mesiac_zo_suboru=mesiac(m_datum)
 else
  Mesiac_zo_suboru=mesiaca(m_datum)
 endif
end function

REM Funkcia pre konverziu mesiaca dátumu na jeho názov
function Datum2Text(datum as string, zaklad_tvar as boolean, jazyk as string) as string
 ' Význam parametrov:
 ' datum – dátum ako reťazec dd.mm.rrrr
 ' zaklad_tvar – ak true, názov mesiaca nebude skloňovaný (január), inak bude skloňovaný (januára)
 ' jazyk – označenie jazyka (sk, cs, en, …)
 dim dd, rr as string
 dim mmc as integer
 
 ' Dátum je v tvare dd.mm.rrrr a z toho dostaneme dd. mesiac rrrr alebo dd. mesiaca rrrr (v dátume sú za dňom nezalomiteľné medzery)
 dd=left(datum,3)
 if left(dd,1)="0" then
  dd=right(dd,2)
 endif
 mmc=val(mid(datum,4,2))
 rr=right(datum,len(datum)-6)
 Datum2Text=dd+chr$(&HA0)+Mesiac_zo_suboru(mmc, zaklad_tvar, jazyk)+" "+rr
end function

REM Makro pre vloženie aktuálneho dátumu v tvare dd. mesiac rrrr ako reťazec na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum_text_zaklad
 dim dokument, bunka as object
 dim teraz, datum, cas, jazyk as string
 dim i as integer
 teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
 i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
 datum=left(teraz,i-1) ' Dátum
 if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
  ' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
  dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
  bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
  jazyk=left(bunka.CharLocale.Language,2) ' Jazyk bunky (sk, cs, …)
  bunka.string=Datum2Text(datum,true,jazyk) ' Vloženie dátumu ako reťazca
 endif
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
  ' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
  dokument=ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
  dokument.collapseToEnd() ' Skočíme na koniec prípadne označeného textu a zrušíme označenie
  jazyk=left(dokument.CharLocale.Language,2) ' Jazyk znaku, na ktorom sa nachádzame (sk, cs, …)
  vloz_do_dokumentu(Datum2Text(datum,true,jazyk))
 endif
end sub

REM Makro pre vloženie aktuálneho dátumu v tvare dd. mesiaca rrrr ako reťazec na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum_text_tvar
 dim dokument, bunka as object
 dim teraz, datum, cas, jazyk as string
 dim i as integer
 teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
 i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
 datum=left(teraz,i-1) ' Dátum
 if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
  ' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
  dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
  bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
  jazyk=left(bunka.CharLocale.Language,2) ' Jazyk bunky (sk, cs, …)
  bunka.string=Datum2Text(datum,false,jazyk) ' Vloženie dátumu ako reťazca
 endif
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
  ' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
  dokument=ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
  dokument.collapseToEnd() ' Skočíme na koniec prípadne označeného textu a zrušíme označenie
  jazyk=left(dokument.CharLocale.Language,2) ' Jazyk znaku, na ktorom sa nachádzame (sk, cs, …)
  vloz_do_dokumentu(Datum2Text(datum,false,jazyk)) ' Vložíme aktuálny reťazec + dátum
 endif
end sub

Neprehliadnite: