Skočiť na obsah Skočiť na menu

Inet.sk - internetový denník

internetový denník

Makrá v OpenOffice.org 02/2008

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


Pôvodná diskusia k článku

nedokážem nahrať macro aby mi vytvorilo nový list , je to možné alebo sa tento príkaz musí napísať.
dakujem za odpoved

09. 05. 2008 Michal 78.98.224.xxx

Musí sa to naprogramovať - napíšem o tom článok, lebo je tam veľa možností, ako zadávať názov nového listu. Bude to ale až v 4. dieli (tretí je už totiž napísaný a vyjde na budúci týždeň), takže zrejme v týždni od 19 - 23 mája.

10. 05. 2008 Július Pastierik 87.197.183.xxx

Makrá som už naprogramoval a napísal som o tom článok. Je už uložený v redakčnom systéme, takže teraz to záleží už iba od šéfredaktora, kedy článok zverejní.

Ďakujem za námet na makrá a ak by ste potrebovali niečo naprogramovať, napíšte mi, prosím, mail - pokúsim sa to vyriešiť.

10. 05. 2008 Július Pastierik 87.197.183.xxx

Je Vaša doména voľná?

Platená reklama

Textová reklama

Ako začať podnikať na internete? Nechajte si poradiť. Aký má byť obsah kvalitne www stránky? Tvorba www stránok, Tvorba webu, Redakčný systém - CMS, Prieskumy o nakupovaní na internete, Pôžičky
Kompletné informácie o Kika Banská Bystrica | Čo takto navštíviť Viedeň? | Zaujímavé informácie priamo od zdroja

Newsletter


Copyright © 2002 - 2012 Inet.sk, s. r. o.Všetky práva vyhradenéNeprešlo jazykovou úpravouISSN 1336-1899

Využívame kvalitný webhosting za rozumnú cenu od Webhosting Inet.sk


Bilancia skrývky Fotokniha Fotografie Osobnosti.sk