Kopírovat můžete více způsoby. První, který si ukážeme, je kopírování pomocí schránky, stejně jako při standardním kopírování v dokumentu.
Kopírování včetně formátu
Pro kopírování včetně formátů můžete použít postupy pro kopírování listů, řádků/sloupců a buněk. Posledním způsobem, jak kopírovat, je využít možností schránky. Schránka funguje na principu načtení obsahu a formátu a jejich vložení na určené místo.
Kopírování pomocí schránky
Zkuste si pomocí Záznamníku maker nahrát makro, při kterém zkopírujete data a vložíte je jinam. Takové makro může vypadat takto:
sub kopirovani dim document as object dim dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") dim args1(0) as new com.sun.star.beans.PropertyValue args1(0).Name = "ToPoint" args1(0).Value = "A1" dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) dim args3(0) as new com.sun.star.beans.PropertyValue args3(0).Name = "ToPoint" args3(0).Value = "C1" dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3()) dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array()) end sub
Všimněte si řádků s metodami Copy a Paste. První z nich vezme data z definované oblasti (zde z buňky A1) a zkopíruje je do schránky. Druhý naopak vloží obsah schránky, kam je mu programem určeno (C1).
Takto nahrané makro zkopíruje buňku tak, jak je, s veškerým formátováním. I zde můžete použít volbu Vložit jinak. Zrušte označení Vše a vynechte například objekty. Makro se změní:
dim args3(5) as new com.sun.star.beans.PropertyValue args3(0).Name = "Flags" args3(0).Value = "SVDFNT" args3(1).Name = "FormulaCommand" args3(1).Value = 0 args3(2).Name = "SkipEmptyCells" args3(2).Value = false args3(3).Name = "Transpose" args3(3).Value = false args3(4).Name = "AsLink" args3(4).Value = false args3(5).Name = "MoveMode" args3(5).Value = 4 dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())
Vidíte, že metoda Paste je zde vynechána a nahrazena metodou InsertContents. Zatímco Paste nevyžaduje žádné další specifikace (vkládá vše), při InsertContents už musíte specifikovat, co a jak požadujete vložit.
args3(0).Name = "Flags" args3(0).Value = "SVDFNT"
Tento první příkaz je pro vás zřejmě nejdůležitější. Určuje, jaký druh hodnot máte vkládat.
S – String – vložit text
V – Value – vložit číslo
D – Date and Time – vložit datum a čas
F – Formula – vložit vzorce
N – Anotation – vložit poznámky
T – Attribution – vložit formáty
Poznámky a formáty nejsou označeny prvním písmenem, protože obě začínají na A a také proto, že písmeno A označuje All – tedy vložit vše. Další možnosti volby Vložit jinak většinou nevyužijete a v makru je můžete s klidem vynechat:
dim args3(O) as new com.sun.star.beans.PropertyValue args3(0).Name = "Flags" args3(0).Value = "SVDFNT" dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())
Pokud ale zasahujete do počtu argumentů, nezapomeňte také změnit počet argumentů v jeho definici (dim args3(0) – původně args(5)). Pro kopírování dat je tento způsob dostačující, jen doporučuji nahradit definici zdrojových a cílových buněk ze záznamníku na klasické zadání adresy tak, jak je již znáte z dílu o buňkách.
Kopírování tímto způsobem můžete použít jak na jednotlivé buňky, tak na rozsahy buněk. Není možné ale takto kopírovat nesouvislé oblasti. K tomu je nutné využít jiný způsob.
V udání cíle je také možné použít adresu pouze jedné buňky i přesto, že zkopírovaná oblast byla větší. Program využije tuto buňku jako první buňku oblasti, do které se má obsah schránky vložit.
Metoda getTransferable() a insertTransferable()
Rychlejší metodou pro kopírování obsahu buněk je metoda getTransferable() a insertTransferable(). Tato metoda také způsobí kopírování obdobným způsobem jako prostřednictvím schránky. Nemůžete ale využít výhod voleb Vložit jinak.
Doc = thisComponent zkopiruj = doc.Sheets(0).getCellRangeByName("A1:C3") doc.CurrentController.select(zkopiruj) obsah = doc.CurrentController.getTransferable() vloz = doc.Sheets(0).getCellRangeByName("F1") doc.CurrentController.select(vloz) doc.CurrentController.insertTransferable(obsah)
Makro nejprve vybere oblast, kterou označí (doc.CurrentController.select(zkopiruj)) a zkopíruje ji do schránky (doc.CurrentController.getTransferable()) v proměnné obsah.
Následně vyberete buňku, do které má být vložen počátek zkopírovaných dat (může jít i o jiný sešit), buňku označíte a vložíte data (doc.CurrentController.insertTransferable(obsah)).
TIP: Tato metoda je rychlejší a nezatěžuje tolik systém jako kopírování prostřednictvím uno:Copy, uno:Paste a uno:InsertContents. Pokud makrem kopírujete často, využijte radši této metody.
Kopírování pouze obsahu buněk
Pokud chcete kopírovat pouze obsah buněk bez formátů (stejně jako Vložit jinak), nemusíte využívat schránku, ale stačí předávat hodnoty načtením do proměnných s následným adresováním jinam. Princip je shodný, ale provedení je rychlejší (není využívána schránka) a kopírování probíhá na „pozadí“ dokumentu. Není tedy vidět, jak a co se kopíruje. Formát můžete ovlivnit pouze částečně, a to druhem zobrazení proměnné (text, čísla, vzorce...).
Kopírování předáním proměnné
Pro kopírování stačí pouze načíst hodnotu buňky do proměnné (bunka1) a její vložení do jiné proměnné (bunka2)
bunka1 = thisComponent.sheets(0).getCellByPosition(0,0).value bunka2 = thisComponent.sheets(0).getCellByPosition(1,0) bunka2.value = bunka1
Takto jednoduše si předáte hodnotu buňky A1 do buňky B1. Měnit můžete i typ hodnoty (string – text, formula – vzorec...).
Metoda getDataArray a setDataArray
Nastane také situace, kdy budete potřebovat kopírovat data z více než jedné buňky. Podmínka této metody je, že oblast buněk musí být souvislá.
oblast_zdroj = list.getCellRangeByName("A1:C5").getDataArray ' načteme data list.getCellRangeByName("A10:C15").setDataArray(oblast_zdroj) ' vložíme data
Tímto způsobem jste zkopírovali data z A1:C5 do A10:C15. Formátování cílové oblasti zůstane nezměněno, kopíruje se pouze obsah buněk.
UPOZORNĚNÍ: zdrojová i cílová oblast musí mít shodnou velikost, jinak makro skončí chybou. V příštím díle se začneme zabývat formátováním buněk.