Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 22. 8. 2017 11:51:28

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

pole buněk do xml

Dobrý den,
potřeboval bych poradit, jak napsat xslt pro export pomocí xml filtru.
Nějký syntax bych dal dohromady, ale nenašel jsem, jak definovat oblast buněk pro export. Potřebuji exportovat např. pouze pole buňek B5:D12 z listu 2.

Plus jako bonus, poradit, pokud jde do exportu zahrnout nějaký text jako "konstantu"


účel: v xml souboru má být určitý text pevně daný a některé proměnné v textu vzaté z tabulky na listu 2.

Děkuji

Offline

#2 22. 8. 2017 12:46:35

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Exportní stejně jako importní filtry existují a lze je editovat, nebo vytvořit podle nich vlastní:
NÁSTROJE > NASTAVENÍ XML FILTRU. Tam si můžete vybrat z filtrů které se nejvíce podobají aplikaci do které chcete exportovat.
     XSLT je dáno cílovou aplikací takže jde o to přizpůsobit exportní filtr výstupu. Filtry pro OpenOffice jsou napsány v Javě ale dají se snadno přizpůsobit pomocí externích nástrojů. Není to žádná extra věda a viděl jsem na cizích fórech několik návodů jak si e/i filtr vytvořit.


     Nejčastěji se používá export do CSV, ale také se makrem vytváří xml soubory. Jde tam jenom o strukturu a názvy uzlů (node) respektive parametry. XML se exportuje bez filtru často pokud se posílá někam na síť a mám dojem že by Vám mohlo jít spíš o takový export nežli o vytváření dokumentů externího formátu (pomocí filtru).


     Pokud se nebojíte maker pošlu Vám vzor nebo i volně strukturovaný xml výstup - ten si pak musíte předělat podle potřeby.
     Když se exportuje pomocí filtru tak celý export musí být na samostatném listu (alespoň nevím o tom že by šlo exportovat jen část obsahu podobně jako dde). Tato úprava by se musela udělat uživatelsky - což není problém. Potom se aplikuje export pomocí filtru. Tedy žádné programování mimo filtru. Pro malé věci je ale určitě lepší makro. To znamená umět alespoň trošku programovat.

Editoval neutr (22. 8. 2017 12:52:57)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 23. 8. 2017 08:28:50

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

Re: pole buněk do xml

Výstupní XML je program pro obráběcí stroj. Pokud se dá vytvořit xml pomocí makra, kde si vyberu oblast buněk, kde jsou proměnné a dále bude v makru "natvrdo" napsán text, pak je to přesně to, co potřebuji. Mohu poprosit o nějaký makro mustr?

Offline

#4 23. 8. 2017 08:44:47

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 842

Re: pole buněk do xml

Smrkoul napsal(a)

Výstupní XML je program pro obráběcí stroj. Pokud se dá vytvořit xml pomocí makra, kde si vyberu oblast buněk, kde jsou proměnné a dále bude v makru "natvrdo" napsán text, pak je to přesně to, co potřebuji. Mohu poprosit o nějaký makro mustr?


Program pro obráběcí stroj bych řešil jinak, než datazy na fórech. Poslední zpráva naznačuje, že ani v programování se moc neorientujete. Sežeňte si raději specialistu.

Offline

#5 23. 8. 2017 11:08:45

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Souhlasím s "lp." - stačí málo a uděláte malér jako Brno. Navíc je potřeba vidět vzor. Psát něco "z voleye" je hazard i když by to byla jen domácí frézka nebo souřadnicová vyvrtávačka.
     Díval jsem se na Vaše předchozí příspěvky a vím že něco málo o makrech víte. Takže vzor makra mohu poslat ale Vy potřebujete nejprve vzor. Je otázkou jak je stroj řízen. Vypadá to na protokoly přenášené pomocí http. Při tom se častěji používá html nežli xml (nejsem odborník jen mne sem tam chytilo bastlení). Často je přenos prováděn pomocí CSV respektive obyčejnými textovými protokoly - například hpgl.
     Napsat makro pro export xml je jedna věc, ale dynamicky měnit obsah proměnných (načtením ze sešitu) je věc druhá. Potvrďte že potřebujete pevně daný úsek B5:D12 z listu 2 (že se nebude měnit). Dále potvrďte že hodnoty proměnných mají nebo nemají desetinná čísla a že mohou být v textovém formátu - nebo jen čísla. Typy proměnných jsou definované a musíte vědět jak mají být deklarované.
     Pokud si nejste jist, nebo nemáte vzor nechte to být. Zejména pokud by to mělo řídit "dospělou" mašinu.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#6 23. 8. 2017 11:38:37

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Jen pro ukázku příklad makra :

Sub Export_XML
Dim oleService, oXMLexp as Object, oXMLimp as Object
Dim oRoot, oNode as Object 
Dim HOME as String
oleService = createUnoService("com.sun.star.bridge.OleObjectFactory")  
HOME = "C:\Documents and Settings\" 'Sem přesnou adresu - třeba jméno\Plocha\
oXMLexp = oleService.createInstance("Msxml.DOMDocument")
With oXMLexp 'Export
    .async = False 
    .validateOnParse = False 
    .resolveExternals = False 
    oRoot = .createElement("Root") 
    .appendChild(oRoot) 
    oNode = .createElement("ElementA") 
    oNode.Text = "Text Elementu A"                 
    oRoot.appendChild(oNode) 
    'MsgBox oNode.xml
    oNode = .createElement("ElementB") 
    oNode.Text = "Text Elementu B"
    oRoot.appendChild(oNode)
    MsgBox .xml ' Tohle je jen pro kontrolu - klidně to smažte
    .Save(HOME & "\MujTest_1.xml") 'název xml dokumentu
End With
End Sub

     Ovšem to jen ukázka uložení obsahu. Je nutné tam uvést kódování a další věci. zejména názvy uzlů kterým stroj rozumí. Mimo toho si musíte uvědomit, že udělat makro s měnitelným obsahem obnáší mnohem více. Lze například místo psaní "Node" načíst obsah ze sešitu a uložit jako XML. To lze udělat několika způsoby.
     Když se nebude export řešit načtením přesné předlohy ze sešitu - píše se makro jiným makrem a to se následně hned spustí a tak se xml uloží.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#7 23. 8. 2017 12:00:52

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

Re: pole buněk do xml

Pro upřesnění, že nejsem úplný nýmand: naprogramovat frézku není problém, dělám 5-ti osé programy... na to je ale jiný software. Dokonce i 3osý postprocessor jsem dal dohromady, jenže to je zase jiný jazyk.
Tento program je pro EDM stroje, kde doposud byl program víceméně texťák o dvaceti řádcích. S novým řídícím systémem přešli na zápis programu v něčem co vypadá jako XML (lze imortovat i starý txt soubor, ale jsem tvor zvídavý a navíc šťoura a rád bych se posunul dále a ulehčil lidem práci na stroji)

malá ukázka vzoru:

- <block isConverted="true" isValid="true">
  <key number="40" isActive="true" />
- <gList>
- <cncFunction number="">
  <cncParameter name="axisX" value="0.000" />
  <cncParameter name="axisY" value="0.000" />
  </cncFunction>
  </gList>
  </block>
- <block isConverted="true" isValid="true">
  <key number="50" isActive="true" />
- <mList>
- <cncFunction number="45">
  <cncParameter name="tankHeight" value="230.000" />
  </cncFunction>
  </mList>
.....
....
...
- <gList>
- <cncFunction number="1">
  <cncParameter name="axisX" value="286.000" />
  <cncParameter name="axisY" value="89.000" />
  <cncParameter name="axisZ" value="128.000" />
  <cncParameter name="axisC" value="30.000" />
  </cncFunction>
  </gList>
....
....
....

Mám tedy tabulku, kde jsou parametry procesu. např. výška hladiny - formát: číslo.
v řádku:
  <cncParameter name="tankHeight" value="230.000" />
bych tedy vše bral jako text, pouze hodnotu 230 bych bral z buňky...

dále v tabulce jsou souřadnice X-Y-Z-C.
- <cncFunction number="1">
  <cncParameter name="axisX" value="286.000" />
  <cncParameter name="axisY" value="89.000" />
  <cncParameter name="axisZ" value="128.000" />
  <cncParameter name="axisC" value="30.000" />

tady bych to vyplňoval smyčkou (to už jsem si stihl najít, takže syntax bych snad dal dohromady)

jestli se vyjádřím správně, tak by se jednotlivé řádky daly brát jako string prefix, real value (moje hodnota buňky), string suffix

a abych odpověděl: vždy se tedy jedná o pevně danou buňku resp. oblast buněk s číselným obsahem
string bych mohl například definovat v jiných buňkách jako text.

Jestli budete tak hodný a vytvořil mi makro, které uloží soubor s příponou ".ncx" do stejné složky, kde je zdrojový ".ods". Bude ukládat Buňku např. B6 ve formátu:  prefix z F6 - hodnota z B6 - suffix z G6.
Snad už bych se pak chytil, dodělal smyčku a nakopíroval potřebné řádky, aby byl výsledek pro stroj čitelný.

Děkuji

Offline

#8 23. 8. 2017 12:31:45

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Dobře chvilku na to potřebuju. Jenom mi není zřejmé toto :
3 sloupce
B6 = hodnota bez úpravy s tečkou (za tečkou jsou tisíciny),
F6 = prefix obecně - ten si potom doplníte
G6 = sufix obecně - také doplníte
    Původně jste psal o úseku B5:D12 - to už asi neplatí. Chcete vzorové načtení 1 řádku a uložení do makra které se pak samo uloží do adresáře kde je zdroj ODT.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#9 23. 8. 2017 12:58:03

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

Re: pole buněk do xml

ano, číslo je na tisícíny (s tečkou).
vzorově pro jeden řádek. makro uloží soubor do stejného adresáře, kde je zdrojová tabulka

Offline

#10 23. 8. 2017 16:58:44

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Otestujte tento pokus Export XML.
    Asi to nebude úplně ono ale podle popisu to dělá vše. Stažený sešit se spouští pomocí hlavní nabídky - úplně vpravo nahoře "Ovládání vrtačka". Nejprve se makro zeptá kolik řádků má načíst. Podle vzoru ve druhém listu (jsou tam 3 řádky). Když by jich tam bylo 150 tak to pobere také. Stačí zadat počet ale šlo by to i automaticky načíst například podle vybraného úseku ap.

    Ukládá "cnx" do stejného adresáře jako je sešit. Musíte vykoumat kam připsat potřebné řádky. Vše se píše do makra Generuj_Makro_XML. Dalších kódů si nevšímejte - jeden načítá adresu a druhý pole ze sešitu.


    Bohu žel pochybuji že je to správně koncipováno. Podívejte se na výstup CNX a uvidíte že by to mělo být jinak. Já bych se k tomu dostal až nejdříve v pátek večer, nebo sobotu ráno.


PS: Zapoměl jsem připsat, že to makro generuje jiné makro do nového modulu "Generovaný", ale hned ho také spustí. Z toho vyplývá že pokud to uložíte, zůstane tam ten modul Generovaný a podruhé by měla vyskočit chyba. Cestou je smazat ten modul.
     Když to neuložíte můžete vgenerovat vždy znovu a nic mazat nemusíte. Takže přepište parametry do sešitu, uložte sešit, následně spusťte makro a hned potom sešit zavřete - bez uložení! Samozřejmě soubor "cnx" zůstane.

Editoval neutr (23. 8. 2017 17:18:37)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#11 25. 8. 2017 12:36:43

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

Re: pole buněk do xml

Děkuji, nějak se tím prokoušu.

trochu jsem studoval literaturu, delal par pokusu a narazil na problem (trochu off topic k tomuto tematu):

Sub EXPORT
Dim soubor as string
Dim fileno as integer
Dim radek1 as object
Doc = ThisComponent
Sheet = Doc. Sheets ( 1 )

radek1 = sheet.getCellByPosition( 2 , 1 ) 'radek 2
soubor =  "D:\pokus.txt"
fileno = freefile

Open soubor for output As #fileno

write #fileno radek1.string()

close #fileno

End Sub


vystupem je zapsani obsahu bunky do souboru, akorat mi to porad pise do uvozovek.   Kdyz je v bunce napsano AHOJ, v souboru mam "AHOJ" ...  daji se nejak uvozovky odstranit? Potreboval bych cisty text.
Dekuji

Offline

#12 25. 8. 2017 13:02:12

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

Re: pole buněk do xml

už nic, pomohl příkaz print místo write....

Offline

#13 25. 8. 2017 13:52:25

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Ano to makro které uvádíte upravuje textový soubor, což je ale dost daleko od XML, nebo podobného značkového jazyka. Nicméně já jsem nenašel relevantní odkaz na syntaxi souborů s příponou .ncx nebo .cnx. Takže jediné co vím je že by to mohly být grafické soubory, nebo soubory pro schematický editor.
     Potenciálně lze psát cokoliv jako text a uložit s libovolnou koncovkou, takže když nejsou známá nebo stanovená pravidla lze použít jiný systém makra. Existují makrem definované filtry rozdílné od toho mnou uvedeného. Ten výstup který jsem postnul je docílen pomocí UNO ale existují filtry se Star Basic. Jednoduše se přilepí k nějakému textu. Text by měl splňovat zásady (pravidla) UTF-8 ale i to je ve hvězdách pokud neznáme popis syntaxe. Někdy stačí Windows 1250 a podobně, ale u starších strojů přichází do úvahy mnohem více kódových stránek.


     Je celkem nejsnadnější vytvořit obsahy tagů v sešitě pro celý obrobek a jednoduchým cyklem načíst do text souboru s tagy. To pak uložit pod libovolnou koncovku buď s konverzí na znakovou sadu, nebo bez.
     Já jsem se úzce držel xml ale mohlo by to být také html. Předpokládám, že vzorové makra chcete vytvořit pro jednotlivé operace a ty pak manuálně spojit do celku který popíše celý postup na obrobku. Právě tohle se dá zautomatizovat nejlépe přípravou v sešitě (nejen zadáním jednotlivých parametrů). Sešit má 1,048 milionů řádků které lze použít tak aby každý tag měl svůj řádek a nakonec makram spojit do podoby značkového jazyka (xml, html, uml).
     Dokonce si myslím, že by to šlo udělat podle dříve použitých textových souborů. Je mi jasné, že zřejmě původní "programování" obsahovalo pouze instrukce pro PLC s malou sadů následných úkonů. To co se děje nyní je napojení modemu řídícího systému a obsluha už jen upíná obrobky a spouští celkový proces z terminálu.


     Samozřejmě je to Vaše snaha a Vy si musíte promyslet co a jak udělat. Takže jen upozorním, že v tom mém makru je několik chybiček které jsem pustil dík časové tísni a není to vůbec odladěné. Správně by se nová makra měla buď ukládat, nebo mazat, měla by obsahovat odpovídající názvy modulů a maker respektive namespace pro xml a podobně.
     Já osobně být zřejmě na Vašem místě bych se snažil o konverzi programu z autocadu, nebo v čem ji máte tak aby se načítal do komunikačního protokolu, nebo bych se pokusil pomocí OCR načíst scanovaný plán (často PDF), a vše převádět jako celek všech instrukcí. Jednotlivé operace by se mohly testovat buď samostatně na popisný soubor, nebo na grafický soubor který by šel porovnat s originálem. Tohle umožňuje programování v Draw. Ovšem už to chce nějaký čas a zřejmě specialistu.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#14 27. 8. 2017 14:13:30

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: pole buněk do xml

xml vytvářím tak že nejdříve poskládám text jednotlivých bloků na jednotlivých listech a pak pomocí makra kopíruji jednotlivé bloky s různými proměnnými za sebou do dalšího listu, kde se vlastně poskládá finální podoba xml. Proměnné jsou uvedené v nějaké základní tabulce. Finální list pak exportuji pomocí běžného textového exportu, akorát jako příponu volím xml. Funguje to dobře a v sešitě je to jakž takž přehledné. Nejde tedy o žádný xml filtr, ale jen strukturovaný zápis textu s příponou xml.
Myslím že vytváření složitějšího xml pomocí příkazu write #fileno je zbytečně složité.


LibreOffice 5.4.

Offline

#15 29. 8. 2017 07:57:30

Smrkoul
Člen
Registrace: 10. 2. 2010
Příspěvků: 12

Re: pole buněk do xml

Děkuji všem, makro napsáno a funguje skvěle. Až na jeden podstatný problém.
používám funkce:

ocellP21 = sheet.getCellByPosition( 1 , 7 ) 'koncova X
print #n ocellP21.value

když je v buňce desetinné místo, tak mi to exportuje s desetinnou čárkou. Potřeboval bych tečku. Ikdyž změním formát buněk, tak to nepomůže.
Je nějaký příkaz, který změní desetinný oddělovač při exportu makrem?
Děkuji

Offline

#16 29. 8. 2017 08:13:22

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: pole buněk do xml

Jsou zhruba 3 možnosti :


A : Použít filtr který to zformátuje správně.


B : Použít místo ocellP21.value  ocellP21.string
     Předpoklad je že v sešitě bude tečka a nikoliv čárka - to se dá upravit makrem při vlastním zápisu. Jde to i manuálně po jedné buňce to je ale zcestné.


C : Výsledný soubor na konci nebo jednotlivý řádek před zápisem projet cyklem a změnit čárku na tečku.


     Správně by to měla být metoda A, nebo B. Pro Calc je totiž číslo s tečkou skutečně stringem který by měl být také ve formátu sešitu - ale nemusíme to v sešitě extra formátovat.
     Je však pravděpodobné že vycházíte z výpočtu který nutně (poznámka) potřebuje čárku. Lze to celé naráz naformátovat pomocí formátu buňky > čísla > text (@). Následně udělat záměnu čárky za tečku.
(POZNÁNKA : - Lze navolit pro všechny sešity Calc americké formátování - tedy tečka se čte jako u nás čárka. To je ale většinou nepraktické a nehodí se to vždy.)
     Z těchto důvodů (nepoužíváte konverzi na UTF-8, nepoužíváte USA formátování čísel a úprava na string je zbytečně pracná) je potřebné použít metodu C. Ovšem metoda přepisu vyžaduje jinak koncipovat makro. Například cyklem nejprve extrahovat sloupec stringů a dodatečně ho projet cyklem přepisu, nebo přepis čárky udělat cyklem před načtením řádku.

Editoval neutr (29. 8. 2017 08:33:21)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

Zápatí