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

#1 27. 2. 2014 12:20:35

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

Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Odděleno od vlákna Makro - kopírování textu do txt


-----



Dobrý den
níže uvedený kód používám k exportu do txt ale nevyznám se v hodnotách toho argumentu. Všechny true jsem změnil na nula takže mi to nedělá uvozovky ale ještě bych potřeboval zrušit čárku a nahradit mezerou. Mým cílem je výstup kdy jednotlivé buňky budou za sebou oddělené mezerou a jednotlivé řádky budou na samostatném řádku.

Můžete mi prosím poradit?
Ludvík

sedlacekdan napsal(a)

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)


______________________________________________________
Oddělil jsem Váš dotaz od starého vlákna

;o)

Editoval ludviktrnka (4. 3. 2014 11:47:14)


LibreOffice 5.4.

Offline

#2 27. 2. 2014 13:34:00

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

No samotná mezera má číslo znaku Char(32), čárka = Char(44), Uvozovky Char(34). Takže vyzkoušejte zaměnit

arg(1).Value = "32,34,76,1,,0,true,true,true"

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 27. 2. 2014 17:24:36

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Díky neutrovi, nakonec mi funguje toto. Ty další paramatry (true, true) říkají zřejmě také něco o zachovávání či potlačení formátu čísel a možná ještě něco dalšího :-)

arg(1).Value = "32,0,76,1,,0,0,true,true"


LibreOffice 5.4.

Offline

#4 27. 2. 2014 19:04:00

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Jde jen o to, že to makro, repektive argument(1) je totéž co dialog v importním filtru. Takže když se na to podíváte, postačuje jen méně parametrů. Například ten parametr "76" je velké písmeno "L" - to byste se asi divil co Vám to udělá na jiném místě. Já nyní nejsem doma a nemohu se podívat, ale určitě buď ty argumenty mohou být prázdné, nebo jich může být méně. Jsou tam totiž také nepovinné, které se deklarovat nemusí. To "L" může být například zarovnání "Left", ale zřejmě tam vůbec být nemusí. Já si dokonce myslím, že když byste si nahrál makro pomocí záznamníku, tak by to mělo být také vidět stejně jak to udělal Dan. Dá se to také dohledat na internetu například pod heslem filter, import text ap.
- Normálně se podívejte co a jak se zadává v tom klasickém importním filtru a to, co nepotřebujete smažte v tom argumentu. Čárka je typická pro pro .csv soubory, které jsou také jen "textové".

Editoval neutr (27. 2. 2014 19:13: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

#5 27. 2. 2014 19:49:11

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Jestli se můžu ještě zeptat ... toto makro mi hrozně pomohlo už tak jak je, ale kdyby mohlo buď exportovat jiný list než aktální nebo případně nějaký konkretizovaný výběr buněk na aktuálním listu, tak by to bylo úplně super. Víte i s tímto poradit? Zkoušel jsem to nahrávání makra, ale tam je opravdu pouze jediná možnost a to celý aktuální list. Jedině by šlo se přepnout a pak zase zpět, jenže ve chvíli běhu jiného makra jehož má být toto součástí, budou všechny okolní listy skryté (musí být pro danou funkčnost), tak se obávám že to bude dělat neplechu.
Mým cílem je hromadný export zároveň do pdf (to už umím) a do txt. Jenže samozřejmě do pdf se tiskne a oblast tisku lze definovat a tady je metoda jiná a tak si s tím neumím poradit.

Jo a ten třetí parametr značí (jak jsem tedy dost krokolomě zjistil) znakovou sadu. Ale která se skrývá pod jakým číslem to nevím, ale 76 funguje dobře :-)

Aha tak leccos je tady Pokročilé volby ukládání a načítání souborů

Editoval ludviktrnka (27. 2. 2014 20:26:32)


LibreOffice 5.4.

Offline

#6 27. 2. 2014 20:29:31

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Ano něco z toho jde. Ale více budu vědět zítra až se vrátím domů. Myslím že jde exportovat jiný, nežli aktuální list, ale makro asi nemůže být v UNO. Myslím, že mám podobné bez UNO.
     Horší to bude s tím výběrem. Lze to ale obejít vykopírováním oblasti do nového listu a ten pak exportovat. Možná jde dělat něco s pojmenovaným úsekem databáze. Ono jde možná jen o to, propojit "ostrý sešit" se sešitem "exportním" pomocí odkazů, a ukládat jen ten exportní. Další možností by bylo exportovat do Writeru tiskové oblasti a Writer uložit jako .txt. Kdysi jsem dělal podobné pokusy, ale s obrázky, kde byl text také jen obrázek.


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 28. 2. 2014 11:54:42

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Ještě mne napadlo to, že při kopírování skrytých listů nesmí být tyto zaheslované, nebo nějak ošetřené ochranou buněk - i třeba zamčené bez hesla.
    Maker na téma "Save as, Save - open, open as hiden,..." mám několik desítek. Jsou mezi nimi i taková, která by Vám vyhovovala. Bohu žel většinou jsou upravená podle specifikaxce, kterou jsem jim přidělil, když jsem je upravoval. Z toho byste asi nebyl moudrý.
    Našel jsem ale jedno makro, které je dobře popsané a mám takový dojem, že je původně od Dana Sedláčka, ale to nevím jistě. Mohl byste takové, nebo podobné najít v jeho seriálu "Malá makra".
Je sice v UNO, ale i s tím se dá pracovat při správné úpravě. Možná si na to troufnete sám. Popíšu systematiku:
---------------------------------------------------------------
Hlavní makro (většinou s názvem "main") obsahuje nějaký jeden, nebo více cyklů, kde se generují čísla listů a úseků. Ty se potom předávají jako argumenty dalším makrům.
----------------
Sub Main
For i = 0 to x
kód.......vygeneruje číslo listu(n) a úseku(adresa)
volání následujícího makra (funkce) jménem, nebo funkcí Call. Příklad volání makra "kopiruj".
Kopiruj(N, adresa)
Next i
print "Hotovo - zkopírováno a uloženo jako txt"
End Sub
----------------
Sub kopiruj(ByVal N as integer, adresa as string)
vlastní prováděcí kód...........
Následně můžeme zavolat makro (funkci) která list uloží jako .txt
To se děje jen po jednotlivých listech proto to může být i tady jako součást kódu tohoto makra.
End Sub
---------------------------------------------------------------
To makro, které kopíruje úsek z jednoho dokumentu do druhého je tady:

sub zkopiruj_otevri_vloz
dim document1 as object
dim document2 as object
dim dispatcher1 as object
dim dispatcher2 as object
dim args1(0) as new com.sun.star.beans.PropertyValue
dim args2(1) as new com.sun.star.beans.PropertyValue
dim args3(0) as new com.sun.star.beans.PropertyValue
rem ----------------------------------------------------------------
document1 = ThisComponent.CurrentController.Frame
dispatcher1 = createUnoService("com.sun.star.frame.DispatchHelper")
' zde definujte první buňku v cílovém dokumentu kam se bude vkládat obsah
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1" 
' Kopírujeme vše s operací Přidat (viz volba Vložit jinak)
args2(0).Name = "Flags"
args2(0).Value = "A"
args2(1).Name = "FormulaCommand"
args2(1).Value = 1
' zdrojová oblast v zadávacím dokumentu
args3(0).Name = "ToPoint"
args3(0).Value = "$A$1:$F$10"
adresa = convertToURL("ZDE VLOŽTE ADRESU CÍLOVÉHO SOUBORU")
rem ----------------------------------------------------------------
' označíme zdrojovu oblast - args3
dispatcher1.executeDispatch(document1, ".uno:GoToCell", "", 0, args3())
' a zkopírujeme ji
dispatcher1.executeDispatch(document1, ".uno:Copy", "", 0, array())
' document uložíme (změny) a zavřeme)
ThisComponent.store
ThisComponent.close(True)
' načteme cílový soubor (otevřeme)
StarDesktop.loadComponentFromUrl(adresa,"_blank",0,array())
document2 = ThisComponent.CurrentController.Frame
dispatcher2 = createUnoService("com.sun.star.frame.DispatchHelper")
' přeskočíme do první buňky kam budeme vkládat zkopírovaná data - args1
dispatcher2.executeDispatch(document2, ".uno:GoToCell", "", 0, args1())
' Vložíme obsah schránky (jako všechny hodnoty s volbou přidat) - args2
dispatcher2.executeDispatch(document2, ".uno:InsertContents", "", 0, args2())
' dokument uložíme
ThisComponent.store
msgbox "Údaje byly aktualizovány",0,"PŘENOS PROVEDEN "
end sub

----------------------------------------------
Postupů může být samozřejmě více stejně jako součástí (maker, nebo funkcí). Problém je v tom, že se ukládají jen jednotlivé listy. Naráz se to dá udělat pomocí tiskových oblastí vložených do Writeru. Ten se pak už uloží jako jeden celek. Téhož efektu bychom podobně dosáhli když by se data z různých listů nakopírovala do jediného listu (sekundárního dokumentu - tak jak doporučuji)

Editoval neutr (28. 2. 2014 12:05:17)


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

#8 28. 2. 2014 15:43:11

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Velice děkuji, ale to je pro mne už vyšší dívčí ... jestli to dobře chápu zde se operuje s otvíráním toho nového souboru - to je asi hrozně zdlouhavé - já potřebuji automaticky bezzásahově a rychle vygenerovat cca 150 až max 500 malých textíků v jednotlivých souborech, pro následné rozeslání maily, kde jednotlivé soubory budou jako přílohy. V podstatě už to vyřešené mám, jen musím to makro spouštět z toho listu kde mám vykopírovaná ta data což se mi úplně nehodí, ale lze to přežít :-) Stačilo by mi kdyby existovala proměná, která do té funkce thisComponent.storeToURL vsune informaci o tom který list se má exportovat, to by bylo super a už by mi opravdu nic nechybělo.

Používám nyní toto makro:

sub uloz_txt

dim sSheetName as string
dim i as integer
dim pocet as integer
dim s1 as object
dim pocitadlo as integer
dim tlacitko as integer
dim adresa as string
dim doc as object
dim arg(1) as new com.sun.star.beans.PropertyValue

on error goto konec

doc = thisComponent

    s1 = doc.Sheets.GetByName("faktura_automat")
    sSheetName = "faktura_automat"

	pocet = s1.GetCellRangeByName("X80").Value-1

for i = 0 to pocet

	wait 200

	'jdeme tisknout
	adresa = s1.GetCellRangeByName("X79").String
        arg(0).Name = "FilterName"
        arg(0).Value = "Text - txt - csv (StarCalc)"
        arg(1).Name = "FilterOptions"
        arg(1).Value = "32,,76,28" 'zde hodnota 28 je zcela zbytečná, exportuje se vždy celý list
        doc.storeToURL(convertToURL(adresa),arg())
	
	if i < pocet then
	    pocitadlo = s1.GetCellRangeByName("X1").Value + 1
	    s1.GetCellRangeByName("X1").Value = pocitadlo
	end if

next i

  konec:
  
   msgbox ("Hotovo!",0,"Ukončení")

end sub

LibreOffice 5.4.

Offline

#9 28. 2. 2014 17:03:59

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

Nyní mám zase pocit, že potřebujete něco úplně jiného. Do prázdného listu můžete načítat jednotlivé texty a ukládat hned jako přílohy emailů. Protože v jiném případě musíte jednotlivé texty k emailům přiřazovat. Fakticky by to mělo jít přímo z Calcu do emailu. To lze nejlépe přes dvojí uložení - 1. uložit jako html a hned pak odeslat jako přílohu pošty. Jako příloha html by se to mělo zobrazovat přímo v textu emailu, jinak je to klasická příloha ke stažení - to je otravné a text emailu je prázdný.
    Když si nahrajete makro, tak Vám vyskočí dialog podle volby například takto:
dispatcher.executeDispatch(document, ".uno:SendMail", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:SendMailDocAsPDF", "", 0, Array())
    Má to přílohu, ale musíte zadat adresu a předmět. Tu adresu můžete mít načtenou do paměti a vložit jen jako Ctrl+V. Předmět musíte dopsat (třeba jen "info" a podobně jednoduché texty), nebo si udělat šablonu emailu s předmětem. To je ale otázka spíš co máte za emailového klienta. Jestli Outlock, OutlockExpres, nebo třeba Thuderbird. Viděl jsem i makro, ale nevím kde, které generovalo přímo email se vším všudy. nemám ho poznamenané.


    Otázka generování textu do obsahu přílohy máte zřejmě vyřešenu, ale bude se jednat o kombinaci oslovení Vážení, Vážený pane, Vážená paní ap. Podobně zřejmě oslovení v textu a související vyskloňování.
    Pak už záleží čím to odesíláte - zda Seznamem, Atlasem, Googlem, nebo přes poskytovatele připojení. V některých případech se obsah přílohy zobrazuje přímo v textu emailu, txt a html by se mělo zobrazit možná vždy v textu emailu - ale nevím jistě za jakých podmínek. Někdy se zobrazí i DOC, nebo obrázky. Například ThunderBird umí odeslat hromadně celý adresář stejně jako Outlock.


     Ovšem k takovým účelům mnohem lépe poslouží Writer kde máte funkce pro "hromadnou korespondenci". Calc lze použít pro vygenerování databáze pro Writer. Lze také z Calcu vkládat do Writeru a ten ukládat jako přílohu emailu - html, nebo txt.


     Určitě lze postavit makro, které prakticky jen odklikáním naplní adresář pro poštovního klienta, kterým se pak dá vše odeslat naráz.

Editoval neutr (28. 2. 2014 17:33:41)


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

#10 2. 3. 2014 13:52:51

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

ludviktrnka napsal(a)

V podstatě už to vyřešené mám, jen musím to makro spouštět z toho listu kde mám vykopírovaná ta data což se mi úplně nehodí, ale lze to přežít :-) Stačilo by mi kdyby existovala proměná, která do té funkce thisComponent.storeToURL vsune informaci o tom který list se má exportovat

Export do csv/txt exportuje pouze aktivní list, stačí tedy do makra vsadit příkaz, který určí, který list je právě aktivní.


doc = thisComponent.currentController
list = thisComponent.sheets(2) ' list č. 3 (číslování od 0)
doc.setActivesheet(list) ' nastaví aktivní list

Listy tak můžete procházet pomocí cyklů.


;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

#11 4. 3. 2014 10:20:22

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

Re: Dávkový převod Calc -> pdf a txt zároveň makrem - VYŘEŠENO

díky za rady - asi se musím omluvit neutrovi - je to pro mne příliš náročné - kamarád mi vytvořil samostatný program pro Windows, který spáruje adresy a přílohy a s jednotným textem mailu všechno hezky odešle, takže mým jediným úkolem je vytvořit ty individuální soubory příloh a celkem bych se ani do ničeho dalšího nepouštěl. Omluvám se za nedorozumnění.
Už si generuju PDF a generuji si i TXT, jen to neumím dát dohromady. Zkusil jsem přepínání listu pomocí řádků od "sedlacekdan" ale hned na list=thisComponent.sheets(16) to háže chybu - píše to "neznámá hodnota vlastnosti".


Dávám tedy celý svůj kód, kdyby se vám to chtělo procházet a předem velice děkuji pokud opravdu někdo najde nápravu chyby.

HEURÉKA, CHYBU JSEM MAKONEC OBJEVIL SÁM. Proměnná list není string ale object a je to. Díky mistru Sedláčkovi

sub SheetToPDF_faktura

dim sSheetName as string
dim sSheetName2 as string
dim sRange as string
dim sPATH as string
dim i as integer
dim pocet as integer
dim arg(0) as new com.sun.star.beans.PropertyValue
dim argt(1) as new com.sun.star.beans.PropertyValue
dim PA() as object
dim CRA(0) as new com.sun.star.table.CellRangeAddress
dim dokument as object
dim doc as object
dim s1 as object
dim adresa as string
dim list as string
dim pocitadlo as integer
dim tlacitko as integer

'on error goto konec

dokument = ThisComponent
s1 = dokument.Sheets.GetByName("faktura_automat")

sSheetName = "faktura_automat"
sSheetName2 = "export.txt"

sRange = "E1:M217"

' skryta vychozi objektova promenna
  with ThisComponent.Sheets

    dim bVisible(.Count-2)
 
    for i = 0 to .Count-2
      with .getByIndex(i)
      ' uloz viditelnost listu
        bVisible(i) = .IsVisible
      ' uloz oblasti tisku
        redim preserve PA(i)
        PA(i) = .PrintAreas
      ' zrus oblasti tisku
        .PrintAreas = array()
        if .Name = sSheetName Then                           
        ' Zadany list bude viditelny                         
          .IsVisible = true 
        ' Dle potreby se nastavi oblast tisku  
           if .Name = sSheetName2 Then                           
        ' Zadany list bude viditelny                         
          .IsVisible = true
           end if              
          if sRange <> "" then                               
            CRA(0) = .getCellRangeByName(sRange).RangeAddress
            .setPrintAreas(CRA())                            
          end if
        else
        ' Skryj nezadouci listy
          .IsVisible = false
        end if
      end with
    next i
   end with
   
   msgbox ("Spusť export!",0,"Pojistná zastávka")

	pocet = s1.GetCellRangeByName("X33").Value-1

for i = 0 to pocet

	wait 200
	
	doc = thisComponent.currentController
    list = thisComponent.sheets(16) 'faktura_automat
    doc.setActivesheet(list) ' nastaví aktivní list	
	
	'jdeme tisknout
	sPATH = s1.GetCellRangeByName("X32").String
 	arg(0).Name = "FilterName"
	arg(0).Value = "calc_pdf_Export"
    ThisComponent.storeToURL(ConvertToUrl(sPATH), arg())
    
    doc = thisComponent.currentController
    list = thisComponent.sheets(21) 'export_txt 
    doc.setActivesheet(list) ' nastaví aktivní list
        
    adresa = s1.GetCellRangeByName("X79").String
    argt(0).Name = "FilterName"
    argt(0).Value = "Text - txt - csv (StarCalc)"
    argt(1).Name = "FilterOptions"
    argt(1).Value = "32,,76,28"
    ThisComponent.storeToURL(convertToURL(adresa),argt())
    
    	
	if i < pocet then
		'tlacitko = msgbox ("Vytištěno, chystat další?",36,"Konec tisku?")
		'if tlacitko = 7 then
		   'goto konec
		'end if
		pocitadlo = s1.GetCellRangeByName("X1").Value + 1
		s1.GetCellRangeByName("X1").Value = pocitadlo
	end if

next i

  doc = thisComponent.currentController
  list = thisComponent.sheets(16) 'faktura_automat
  doc.setActivesheet(list) ' nastaví aktivní list
    
  'konec:
  
  msgbox ("Hotovo. Ještě vrátím listy zpět.",0,"Ukončení")
  
  with ThisComponent.Sheets
    for i = 0 to .Count-1
      with .getByIndex(i)
      ' Zobraz puvodni listy
        .IsVisible = bVisible(i)
      ' Nastav puvodni tiskove oblasti
        .PrintAreas = PA(i)
      end with
    next i

  end with
end sub

Editoval ludviktrnka (4. 3. 2014 11:24:25)


LibreOffice 5.4.

Offline

Zápatí