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
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
Nakoniec 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.
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
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.
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
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk