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

#1 2. 6. 2013 18:30:02

wojtastatic
Člen
Registrace: 2. 6. 2013
Příspěvků: 4

Makro-kopírování textu do txt - VYŘEŠENO

Zdravím, potřeboval bych makro, které by z calcu převedlo text to textového souboru, každou buňku dalo do uvozovek a oddělilo čárkou. Zkoušel jsem takové makro vytvořit sám ale nepodařilo se, předem děkuji za pomoc. Výstup by tedy měl vypadat asi takto : "xxx","I0.0","BOOL","Pokus"


________________________________________
Značím jako vyřešené


;o)

Editoval sedlacekdan (24. 6. 2013 19:20:34)

Offline

#2 2. 6. 2013 20:00:13

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

Re: Makro-kopírování textu do txt - VYŘEŠENO

Možností je více. Nejsnadněji sloučíte všechny buňky z řádku do jediné buňky. Dejme tomu do E1 vložíme vzorec například takto :

1. =""""& A1 & "'',''" & B1 & "'',''" & C1 & "'',''" & D1 & """"
2. =CHAR(34) & A1 & CHAR(34) & "," & CHAR(34) & B1 & CHAR(34) & "," & CHAR(34) & C1 & CHAR(34) & "," & CHAR(34) & D1 & CHAR(34)
3. =CONCATENATE(CHAR(34);A1;CHAR(34);",";CHAR(34);B1;CHAR(34);",";CHAR(34);C1;CHAR(34);",";CHAR(34);D1;CHAR(34) )

   Ať už to uděláte jakkoliv, musíte vzorec načíst do paměti a vložit zpět jen jako text. Makro pak načte tyto buňky v jediném sloupci a vykopíruje do txt dokumentu.
   Jinou metodou by bylo vyexportování jako .csv a po načtení ve Writer každou čárku obalit uvozovkami ap. Dejte pozor u prvního příkladu - je zde užita dvojí konvence. Chcete - li zapsat jedny dvojité uvozovky jako uvozovky musíte zadat ="""" - tedy 4x dvojité uvozovky. Druhou možností je ="''". V tom druhém případě to jsou 2 jednoduché uvozovky mezi dvěma dvojitými. Jednoduché uvozovky se zadávají: Levý(ALT + 39) - tedy CHAR(39), zatímco první případ užívá CHAR(34).
   Další možností by bylo do každé buňky zapsat potřebný znak a sloučit jen buňky ve funkci CONCATENATE. Ale to je asi méně technické.


   Samozřejmě to vyexportování je jiné kafe - ale použijte vyhledávání - Dan Sedláček - seriál o makrech a tam to je.

Editoval neutr (2. 6. 2013 20:21:51)


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 3. 6. 2013 07:48:03

wojtastatic
Člen
Registrace: 2. 6. 2013
Příspěvků: 4

Re: Makro-kopírování textu do txt - VYŘEŠENO

Bohužel nevím kolik řádků bude soubor obsahovat. Povedlo se mi napsat makro, které provede export do txt, ale ještě jsou třeba ty uvozovky.

Editoval wojtastatic (3. 6. 2013 07:48:56)

Offline

#4 3. 6. 2013 08:55:38

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

Re: Makro-kopírování textu do txt - VYŘEŠENO

nevím přesně co jste vyštudoval, ale je možné exportovat celý list, nebo jen některé úseky buněk. Pokud vyexportujete celý list, objeví se se jen vyplněné buňky (list má 1,048 milionů řádků a 1024 sloupců - objeví se jen ty popsané).
- Takže pokud Vám stačí list - pak postupijte některým vzorcem, který jsem uvedl, ale dejte je do prázdného listu - po exportu to budou jediné vyexportované data a co je hlavní - budou v řádcích. Tedy co řádek v Calcu - to řádek v txt.
   I když například nevíte kolik těch řádků bude, stačí je před exportem buď seředit, nebo pokud nechcete řadit z důvodů zachování pořadí - odstranit prázdné řádky.
   Předpokládám, že by to mohly být obsahy "div-ů" pro php a podobně. Je to poměrně snadné. Pokud však z nějakého důvodu chcete připisovat export do nějak rozvrženého (existujícího a nějak předvyplněného) txt souboru pak Vám asi Danova makra stačit nebudou.


   V některých případech by se asi vyplatilo načíst nejprve strukturu txt souboru do Calcu, operace vkládání a úprav udělat v Calcu a původní soubor přepsat tím nově vytvořeným. Ale zase jde jen o to, co by jste opravdu potřeboval.
   Pokud chcete dělat úpravy už jen ve Writeru (ani mne nenapadá proč by to tak muselo být), pak bych doporučil nejdříve prostudovat různá rozšíření pro Writer. Mnoho věcí udělal pan ing. Pastierik, nebo se to dá najít například jako funkce rozšíření AltSerach.
   Makra ve Writeru sice pracují dobře, ale když máte přepsat předem neurčený řádek, nebo dokonce větu v řádku tak musíte definovat podle čeho najít - a pak už snadno nahradit ap. Z tohoto důvodu je vždy lepší vypracovat konečnou formu přímo v Calcu.


   Možná máte nějaké specifické potřeby, které se této logice vymykají, ale to by jste měl asi lépe popsat, nebo možná postnout příklad - jak zdroj (Calc) tak očekávanou podobu (Writer).


PS Dan Sedláček píše na každém tématu "jak vložit soubor", ale jde to i například přes "ulož to", nebo jsem se setkal naposledy s podobnou službou České pošty ap.


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

#5 3. 6. 2013 09:18:17

wojtastatic
Člen
Registrace: 2. 6. 2013
Příspěvků: 4

Re: Makro-kopírování textu do txt - VYŘEŠENO

Mělo by to vypadat takto: http://leteckaposta.cz/987499661

Offline

#6 3. 6. 2013 09:55:54

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

Re: Makro-kopírování textu do txt - VYŘEŠENO

Ano to jsem si myslel. Postupujte nejlépe podle 2. vzorce takto:
- Vzorec nejprve vytvořte pro první řádek v listu1.
- Následně jej vystříhněte a vložte do prázdného listu2 - A1. (zachovají se tam adresné odkazy ba list1)
- kopírujte vzorec do tolika buněk, kolik je řádků v listu 1.
- načtěte všechny vzorce v listu2 a vložte zpět jen "text a čísla" (volba vložit jinak).
- před tím, nebo potom pojmenujte list2 tak aby odpovídal deklaraci $name.
- ručně, nebo makrem uložte někam do sdílené (určené složky pro ftp) a pak ftp - do root, nebo kam to potřebujete.

   
   Vzhledem k tomu, že to chcete zautomatizovat, předpokládám plnění listu 1 makrem, protože jinak by nemělo cenu ani makro pro export.
   Pokud je to tak, pak doporučuji nahrát vzorec z buňky A1 - list 2. Pomocí cyklu for...next vykopírovat do ostatních buněk (for i = 0 to XXX) - XXX je hodnota zjištěná makrem - generalfunction.COUNT, nebo také do Basicu portovanou funkcí sešitu "COUNTA".
   Není to žádný problém. Spíš vidím to, že i plnění listu1 by chtělo makro, které čte externí zdroj (url), ale i to se dá udělat snadno. Myslím, že i tohle tam Dan někde má.


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 3. 6. 2013 19:17:32

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Makro-kopírování textu do txt - VYŘEŠENO

Makro pro převod z calcu do txt:

sub uloz_dokument_txt
doc = thisComponent
dim arg(1) as new com.sun.star.beans.PropertyValue
arg(0).Name = "FilterName"
arg(0).Value = "Text - txt - csv (StarCalc)"
arg(1).Name = "FilterOptions"
arg(1).Value = "44,34,76,1,,0,true,true,true"
adresa = "/home/daniel/Dokumenty/nazev_dokumentu.txt"
doc.storeToURL(convertToURL(adresa),arg())
end sub

Důležitá pro přidání uvozovek jsou hodnoty True  v arg(1).Value = "44,34,76,1,,0,true,true,true" kdy jedna z nich (zřejmě ta první - viz dialog pro export do CSV) určuje, zda se mají přidat uvozovky do všech textových polí.

Makro vyexportuje celý list a všechny buňky v něm do txt. Samozřejmě si upravte adresu (URL) podle své potřeby.


;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 5. 6. 2013 10:01:52

wojtastatic
Člen
Registrace: 2. 6. 2013
Příspěvků: 4

Re: Makro-kopírování textu do txt - VYŘEŠENO

Děkuji smile a bylo by ještě možné toto makro upravit tak, aby když je v druhém sloupci I tak před text v prvním sloupci dopsat PI_ , pokud bude v druhém PIW tak před text prvního dopsat AI_ , pokud bude Q tak dopsat DO_ a pokud PQW tak dopsat AO_ ? Tak jako je to na obrázku Makro_%281%29.jpg Děkuji za pomoc.

Offline

#9 5. 6. 2013 11:16:44

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

Re: Makro-kopírování textu do txt - VYŘEŠENO

To je zase jen implementací vnořených dotazů IF. Pokud je to jenom několik podmínek, vypadá to asi takhle pro buňku A1 :

=IF(Left(B1;1)="I";"PI_";IF(Left(B1;3)="PIW";"AI_";IF(Left(B1;1)="Q";"DO";IF(left(B1;3)="PQW";"AO_";"Chyba"))))

    Raději to předem zkotrolijte, píšu to z hlavy (bez zkoušky) a je možné, že například "I"(velké písmeno i) má být malé písmeno(L) ap.



    Pokud by tam byly poněkud podobné vyhledávací znaky - například "i", "ico", "item", musíte zadat nejdříve vyhledávaání "ico", následně "item" a teprve naposled samostatné "i". Je to jasné? To "i" by zafungovalo vždy a ostatních pojmů by jste se nedohledal.
    Takže doporučuji začít delšími vyhledávacími řetězci - v lexikálním uspořádáním a postupovat k méně početným, atd. (Samozřejmě musíte znát jak chodí lexikální řazení - textů - ne čísel!).


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í