Makrá v OpenOffice.org 02/2008

Július Pastierik  /  05. 05. 2008, 00:00

V dnešnom dieli seriálu o makrách si ukážeme, ako dokážeme vytvoriť tabuľku v textovom procesore Writer. Zároveň si ukážeme, ako do nej dokážeme skopírovať obsah zošitu z tabuľkového procesora Calc.

 

Pri tvorení dokumentov, v ktorých chceme prezentovať výsledky práce potrebujeme niekedy vkladať tabuľky. Hoci aj v textovom procesore Writer môžeme do nich vkladať niektoré vzorce, predsa len ich možnosti sú v tejto oblasti obmedzené. Vtedy prichádza do úvahy jediná možnosť – vytvoriť si tabuľku v zošite modulu Calc a nakoniec jej určitú časť preniesť do modulu Writer.

OpenOffice.org v tomto smere neposkytuje priame kopírovanie či dokonca vytvorenie textovej tabuľky, ktorej obsah by bol totožný s obsahom zošita v Calcu. Preto si naprogramujeme makro, ktoré to dokáže. Využijeme na to špeciálnu „schránku“, ktorú si zadefinujeme ako globálne premenné:

REM Makro pre kopírovanie tabuliek z Calcu do Writeru
REM Definícia globálnych premenných špeciálnej "schránky"
global bunky_z_calcu_do_writer(0,0)
global stlpce_z_calcu_do_writer, riadky_z_calcu_do_writer as long

Kopírovaná časť tabuľky v Calcu


Pretože nikdy nechceme kopírovať celý zošit, vo funkcii pre skopírovanie obsahu z modulu Calc budeme pracovať iba s označenou časťou tabuľky:

REM Makro pre skopírovanie tabuľky z Calcu do špeciálnej "schránky"
sub Kopiruj_tabulku_z_Calc_do_Writer
 dim dokument, bunka as object
 dim stlpec, riadok as long
 dim sprava as string
 
 REM Ak sme v tabuľkovom procesore, tak
 if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
  REM Nastavíme sa na označenú časť tabuľky
  Dokument=ThisComponent.getCurrentSelection()
  REM Zistíme rozsah označenej časti - počet stĺpcov a riadkov
  stlpce_z_calcu_do_writer=dokument.getcolumns().Count
  riadky_z_calcu_do_writer=dokument.getrows().Count
  
  REM Ak je počet označených stĺpcov a riadkov nenulový, tak
  if stlpce_z_calcu_do_writer<>0 and riadky_z_calcu_do_writer<>0 then
   REM Zmeníme veľkosť "schránky" podľa aktuálneho výberu
   redim preserve bunky_z_calcu_do_writer(riadky_z_calcu_do_writer, stlpce_z_calcu_do_writer)

   REM Pre všetky stĺpce z výberu
   for stlpec=0 to stlpce_z_calcu_do_writer-1
    REM a pre všetky riadky z výberu
    for riadok=0 to riadky_z_calcu_do_writer-1
     REM Vyberieme bunku a skopírujeme jej obsah do "schránky"
     bunka=dokument.getCellByPosition(stlpec,riadok)
     bunky_z_calcu_do_writer(riadok+1,stlpec+1)=bunka.getstring()
    next riadok
   next stlpec
  endif
  REM Vypíšeme, akú veľkú oblasť tabuľky sme skopírovali do "schránky"
  sprava="Skopírovaných "+str(stlpce_z_calcu_do_writer)+" stĺpcov a "+str(riadky_z_calcu_do_writer)+" riadkov"
  msgbox sprava
 endif
end sub

Oznam o akopírovanej oblastiNakoniec si naprogramujeme funkciu pre vloženie obsahu špeciálnej „schránky“ do tabuľkového procesora. Tu musíme rozoznávať dve situácie. Prvá je, že sa nachádzame vo vnútri už existujúcej tabuľky – v tomto prípade prepíšeme jej obsah. Ak sa nenachádzame vo vnútri tabuľky, tak vytvoríme tabuľku novú s rozsahom, ktorý zodpovedá skopírovanej tabuľke z modulu Calc.

Vložená tabuľka do Writeru

Ešte uveďme, že ak sa nachádzame v už existujúcej tabuľke, makro skopíruje tabuľku od ľavej hornej bunky bez ohľadu na to, kde sme sa predtým nachádzali:

REM Makro pre skopírovanie tabuľky zo špeciálnej "schránky" do Writeru
sub Vytvor_tabulku_z_Calc_do_Writer
 dim dokument, kurzor, tabulka, bunka as object
 dim stlpec, riadok as long
 dim adresa as string
 
 REM Ak sme v textovom dokumente a veľkosť kopírovanej tabuľky je nenulová, tak
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") and _
  stlpce_z_calcu_do_writer<>0 and riadky_z_calcu_do_writer<>0 then
  dokument=StarDesktop.CurrentComponent
  REM Nastavíme sa na aktuálne miesto v dokumente
  kurzor=ThisComponent.currentcontroller.getViewCursor()
  
  REM Ak nie sme v tabuľke, budeme vytvárať novú
  on error goto Nie_sme_v_tabulke

  REM Pokus o sprístupnenie tabuľky, v ktorej sa možno nachádzame
  REM Ak nie sme v tabuľke, vedie to k chybe - uplatní sa príkaz "on error goto Nie_sme_v_tabulke"
  tabulka=kurzor.TextTable
  
  REM Sme v už existujúcej tabuľke
  
  REM Nasledujúci test môžeme vynechať, ak nám nevadí, že sa prepíše iba časť tabuľky
  REM Ak má existujúca tabuľka iné rozmery, ako skopírovaná, tak to oznámime
  if tabulka.columns.count<>stlpce_z_calcu_do_writer or tabulka.rows.count<>riadky_z_calcu_do_writer then
   msgbox "Zdrojová tabuľka má iné rozmery ako cieľová!"
   REM a ukončíme makro
   exit sub
  endif
  
  mame_tabulku:
  REM Už máme určite tabuľku, môžeme do nej vkladať obsah "schránky"
  on error goto next
  
  REM Pre všetky riadky "schránky"
  for riadok=1 to riadky_z_calcu_do_writer
   REM a pre všetky stĺpce "schránky"
   for stlpec=1 to stlpce_z_calcu_do_writer
    REM Pripravíme si textovú adresu tabuľky 
    adresa=chr(64+stlpec)&riadok
    REM Nastavíme sa do bunky textovej tabuľky
    bunka=tabulka.getCellByName(adresa)
    REM A zmeníme jej obsah podľa "schránky"
    bunka.String= bunky_z_calcu_do_writer(riadok,stlpec)
   next stlpec
  next riadok
 else
  REM Ak sme nič v Calcu neuložili, oznámime to
  msgbox "V schránke nie je žiadna tabuľka."
 endif

 REM Ukončíme makro, lebo ďalej je vytvorenie novej tabuľky!
 exit sub
 
 Nie_sme_v_tabulke:
  REM Sme mimo tabuľky, pripravíme si novú
  tabulka=dokument.createInstance("com.sun.star.text.TextTable")
  REM Nastavíme jej rozmery
  tabulka.initialize(riadky_z_calcu_do_writer, stlpce_z_calcu_do_writer)
  REM a vložíme ju do dokumentu na aktuálnu pozíciu
  dokument.Text.insertTextContent(kurzor, tabulka, false)
  REM Vrátime sa nazad - už sme v tabuľke
  goto mame_tabulku
end sub

Oznam, že nemáme nič odpamätanéV prípade, že sa nachádzame v už existujúcej tabuľke, testovali sme aj jej stávajúci rozmer, pričom sme požadovali, aby bol totožný so skopírovaným rozsahom.


Oznam o inom rozmere tabuľky
Toto však nemusí každému vyhovovať. Pokiaľ niekto nechce toto testovať, stačí, ak si príslušnú časť dá ako komentár (pre prípad, že by makro chcel niekedy v tomto smere predsa len zmeniť):

  REM Sme v už existujúcej tabuľke
  REM Ak má existujúca tabuľka iné rozmery, ako skopírovaná, tak to oznámime
'  if tabulka.columns.count<>stlpce_z_calcu_do_writer or tabulka.rows.count<>riadky_z_calcu_do_writer then
'   msgbox "Zdrojová tabuľka má iné rozmery ako cieľová!"
'   REM a ukončíme makro
'   exit sub
'  endif

Neprehliadnite: