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

#1 2. 10. 2018 21:44:12

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

InsertSheetFromFile

Zdravím,

prosím o radu mám sešit do něhož chci vložit list csv ze souboru.

prozatím k tomu používám tento příkaz

 dispatcher.executeDispatch(document, ".uno:InsertSheetFromFile", "", 0, Array()) 

nicméně musím soubor vybrat a několikrát potvrdit.

Tento kód vzešel ze záznamu makra a víc v záznamu nebylo.

Protože takto vkládám postupně více listů je to dosti otravné.
Potřeboval bych jestli tento příkaz má nějaké parametry, kterými bych případně obešel neustále dotazovaní který soubor chci otevřít a  jaké kodování má použít bla bla bla.....

Pokaždé to budou ty samé soubory na stejném místě taktéž stejně kódované.

Existuje nějaký způsob jak vkládat soubor do listu sešitu bezobslužně?

Předem děkuji za reakce

Max

Editoval max2005 (2. 10. 2018 23:36:52)

Offline

#2 3. 10. 2018 05:23:58

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

Re: InsertSheetFromFile

Otestujte toto :

sub NactiExterni 'Otevře vše stejně jako volba VLOŽIT LIST ZE SOUBORU
'Pozor při otevření CSV na určení správného filtru (nejčastější chyba)
'Po výběru souboru se dialog zeptá kam vložit nový list - před nebo za aktuální list
'při tom může nastat problém - list se stejným jménem nesmí existovat. Proto
'bývá nutné buď původní sešit smazat, nebo přejmenovat.
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:InsertSheetFromFile", "", 0, Array())
end sub

Je to samozřejmě totéž co uvádíte, jen je to úplný zápis makra.


     Bylo by to možné udělat lépe - vše na jedno kliknutí ale pak bych musel vědět jestli už podobný sešit neexistuje, nebo kopírovat například pro přidávání zápisů. Nyní jde o načtení celého nového listu, ale dialogem který je shodný s manuální volbou - (možná o 1 kliknutí méně).
     Problém úplného řešení makrem je právě v tom že se musí vědět zda bude nový list přepisovat existující list. Samozřejmě konstantní adresy jsou v tomto dialogu problém, ale dialog si pamatuje poslední otevíranou složku, takže pokud v ní máte všechny soubory k aktualizaci je to v pohodě - vybíráte jen název. Dialog lze rozebrat tak aby najel hned, nebo použít importní filtr - umí to jiný typ makra.


     Nerad bych se dostal do situace kdy dostanu vynadáno, že se stále vyptávám na nesmyslné detaily, proto uvedu že technicky správnou cestou je deklarování proměnných místo :
dispatcher.executeDispatch(document, ".uno:InsertSheetFromFile", "", 0, Array())
například array s názvem Args(číslo - počet argumentů)


dim args(2) as new com.sun.star.beans.PropertyValue
args(0).Name = "URL"
args(0).Value = "file:///C:/.......csv"
args(1).Name = "FilterName"
args(1).Value = "Text - txt - csv (StarCalc)"
args(2).Name = "FilterOptions"
args(2).Value = "44,34,33,1,,0,false,true,true,false" 'číslo 44 reprezentuje základní separátor jako CHAR(44) .. nastavení se musí doladit podle reálných potřeb.
dispatcher.executeDispatch(document, ".uno:InsertSheetFromFile", "", 0, args())

     Tohle ale není odladěné - argumenty patří k příkazu "SaveAs". Zde by byly na místě asi ještě další nejméně 1 argument - vložit před, za a podobně. Ale doporučuji spíš zadat do Google hledání .uno:InsertSheetFromFile a vyskočí hodně řešení i když v anglině a ne vše je přesně to správné ořechové.


     Osobně bych asi při častém opakování takové práce přepisoval data ze skrytých souborů - otevřených skrytě pod výše uvedeným filtrem jen by tam bylo Open a ještě parametry Hidden. Pak už jen rychlé načtení obsahu a vložení do listu - ten se už nemusí mazat - stačí přepisovat obsah a hlavně by to bylo pod cyklem který by iteroval adresář aktualizací.

Editoval neutr (3. 10. 2018 06:25:03)


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. 10. 2018 07:44:00

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: InsertSheetFromFile

Zdravíčko,

máte pravdu zbytečné otázky nemám moc rád, nicméně beru dotaz jako opodstatněný. Jedná se o sešit Zasoby.odt který vždy při spuštění makra tedy ve výchozím stavu bude obsahovat jeden list s názvem vysledek a kde po dokončení makra bude po dohromady 6 listu. Makru je úplně jedno jestli se vložený list vloží před nebo za. Taktéž je mu jedno jaký bude mít název následně po vložení list přejmenuje (pokud by to však šlo parametrem odpadlo by alespoň pár řádků kódu). Nejprve vloží jeden list přejmenuje na Zasoby a poté s ním provede pár úprav a sešit uloží jako csv (samozřejmě po otevření právě uloženého csv bude mít už jen jeden list původně aktivní, ale vzhledem k tomu že sešit nezavírám má v současné chvíli 2 listy) dále provede další úpravy a uloží opět jako jiné csv. Tyto 2 soubory proženu externími aplikacemi a ty mi vychrlí prozatím 4 sešity csv. Ty já opět jeden po druhém importují do stále otevřeného sešitu s původním názvem Zasoby.odt. Tim musím provést nejmenně 16 kliknutí aby operace byla zdárně dokončena. Pokaždé právě vložený list přejmenuje na požadovaný název.

Poté všechny právě vložené listy porovná a zapíše do prvotně importovaného listu Zasoby pomocí příkazu Countif kde každý ze 4 listu má vlastní sloupeček výsledek je buď 1(nelze objednat) nebo 0(lze objednat) tyto hodnoty se pak po řádcích sečtou seřadí vyberou se pouze ty hodnoty co mají výsledek 4 opět countif a překopírují do listu vysledek přidají ještě nějaké doplňující informace a tento aktivní list se uloží jako dbf.

Ty 4 sešity budou vždy na stejném místě se stejným názvem starý bude vždy přepsán.

Pokud jde nějak skrytě otevřít všechny 4 sešity a poté jednotlivě rozkopírovat to mi nevadí prostě aby to vyžadovalo co nejméně uživatelského přístupu. Soubor vlastně porovnává zboží, které lze ještě objednat či nikoli u jednoho ze 4 dodavatelů tedy výsledek 4 znamená, že nejde objednat ani u jednoho a tedy zboží již nemá odbyt.

Řekněme, že sešity od dodavatelů mají názvy dodavatel1, dodavatel 2,.... a listy po přejmenování v1, v2,... .

Jinak jsem právě zkoušel to udělat to formou těch parametrů nicméně vlastně to byla jen kosmetická náhražka neboť stejně sem soubor musel vybrat a stejně sem mu musel zvolit kódování dohromady opět 4 kliknutí smile. Všechny mají kódování windows 1250 latin 2.

Editoval max2005 (3. 10. 2018 10:07:15)

Offline

#4 3. 10. 2018 11:35:58

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

Re: InsertSheetFromFile

Dobře udělám iteraci 4 skrytých sešitů. V hlavním sešitě se vždy smaže příslušný list a vloží se data z načteného skrytého souboru. Na to potřebuju nějakou chvíli. Dostanu se k tomu tak asi kolem 17.00 a když to půjde dobře, máte to do zpráv v 19.00. Ale nebudu předbíhat protože bojuji s operačními systémy. Nyní mohu jen pod Win 7 a Win 10. Když byste měl Linux musím to dodatečně upravit.


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. 10. 2018 13:39:07

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

Re: InsertSheetFromFile

Tak změna plánu otestujte tohle :

Sub Ctu_4_Sesity
Dim cUrl1, cUrl2, cUrl3, cUrl4 as string
cUrl1 = "C:\Users\neutr\Desktop\UJEP\Podklady\DLP20180927\dlp_cesty.csv"
cUrl2 = "C:\Users\neutr\Desktop\UJEP\Podklady\DLP20180927\dlp_doping.csv"
cUrl3 = "C:\Users\neutr\Desktop\UJEP\Podklady\DLP20180927\dlp_indikacniskupiny.csv"
cUrl4 = "C:\Users\neutr\Desktop\UJEP\Podklady\DLP20180927\dlp_jednotky.csv"
'URL nejlépe zjistíte z Hyperlinku odkud vyberete soubor a zkopírujete ho do makra
For i = 1 To 4
Select Case i
Case 1
ImportCSVPrepisList(cUrl1 , "List1")
Case 2
ImportCSVPrepisList(cUrl2 , "List2")
Case 3
ImportCSVPrepisList(cUrl3 , "List3")
Case 4
ImportCSVPrepisList(cUrl4 , "List4")
End Select
next i
End sub

Sub ImportCSVPrepisList(ByVal cUrl as string, ByVal sList as string)
Dim oDoc
oDoc = ThisComponent
cFO = "59,,0,1,,1033,false,true"
'cFO = "59,[1. posice separátor] nyní středník (59), ale nejčastěji 44 (obyčejná čárka) 
'cFO = "59,,[2. pozice oddělovač textu] nyní prázdný, ale často uvozovky jednoduché (39), nebo dvojité (147) 
'Viz odkaz dole. Když to nebude fungovat musíte laborovat, ale myslím že to bude chodit bez úprav
cFN = "Text - txt - csv (StarCalc)"
    Mysh = ThisComponent.getSheets()
    if not Mysh.hasByName(sList) then Mysh.InsertNewByName(sList, 0)
    sh = Mysh.getByName(sList)
    sh.link(cUrl, sList, cFN, cFO, com.sun.star.sheet.SheetLinkMode.VALUE)
'___________________________________________________________________
' - Filtry Exp/Imp https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
'___________________________________________________________________
'	Některé filtry
'Unknown (systém) 								č. znakové sady = 0
'System default 								č. znakové sady = 9
'ISO-8859-2 (Central European) 					č. znakové sady = 13
'DOS/OS2-852 (Central European) 				č. znakové sady = 25
'Windows-1250/WinLatin 2 (Central European)		č. znakové sady = 33
'Windows-1252/WinLatin 1 (Western) 				č. znakové sady = 1
'Unicode (UTF-7) 								č. znakové sady = 75
'Unicode (UTF-8) 								č. znakové sady = 76
'ISO-8859-10 (Central European) 				č. znakové sady = 77
'ISO-8859-13 (Central European) 				č. znakové sady = 78
'Unicode (Java's Modified UTF-8) 				č. znakové sady = 90
'___________________________________________________________________
' popis filtru z výše uvedeného zdroje
'1 – Separátor (číslo Char) př. 44 ap
'2 – Oddělovač textu (číslo Char) př. 34
'3 – Znaková sada (systém) = 0
'4 – první „line" - počet(pozice?) číslo ..1
'5 – pozice – formát (4sloupce) př. 1/5/2/1/3/1/4/1 
'     - 1 -datum YY/MM/DD = 5 (1/5)
'     - 2 -Standard 1 (2/1)
'     - 3 -Standard 1 (3/1)
'     - 4 -Standard 1 (4/1)
'Příklad Filtru "44,34,0,1,1/5/2/1/3/1/4/1" 
End Sub

    Něco se pokazilo v plánu takže jsem při čekání testoval ale nejspíš se plán jen posouvá tak raději posílám první pokus. U mne to funguje. Udělal jsem jen volací makro a bez úprav mi to chodí.


     Ještě detail. Jsou to odkazy. Podívejte se na volbu ÚPRAVY > ODKAZY NA EXTERNÍ SOUBORY. Takže odkazy lze rozpojit, ale když tam budou nové soubory se stejným jménem tak je vše v pohodě. Můžete také opakovat propojení.

Editoval neutr (3. 10. 2018 13:54:36)


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 7. 10. 2018 18:49:37

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

Re: InsertSheetFromFile

Možná pokud to není nutné můžete makrem pracovat s externímy soubory a vůbec je do vašeho sešitu nekopírovat - nebo jen nakopírovat sloupec s výsledky. Můžete si takto otevřít souborů kolik chcete (a to i skrytě na pozadí) a ve do všech můžete sahat na jakékoli buňky a pracovat s nimi. Takto otevřete samozřejmě jakýkoli .ods ale i .csv. Pokud přesně znáte ztruktutu toho csv a ta se nemění  pak to jednoduše lze. Návod najdte u pana Sedláčka https://www.openoffice.cz/doplnky/vytvo … moci-maker. Takto otevřete/zpřístupníte doc1, doc2, doc3, doc4 ... a můžete s tím dělat cokoli. Já většinou používám kopírování dat pomocí tohoto schematu:

oblast_zdroj = list1.getCellRangeByName("A1:C5").getDataArray ' načteme data
list2.getCellRangeByName("A10:C15").setDataArray(oblast_zdroj) ' vložíme data
(opět odkaz na Sedláčka: https://www.openoffice.cz/doplnky/kopirovani-dat

Editoval ludviktrnka (7. 10. 2018 20:22:29)


LibreOffice 5.4.

Offline

#7 7. 10. 2018 20:33:35

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: InsertSheetFromFile

neutr napsal(a)

Tak změna plánu otestujte tohle :
   Něco se pokazilo v plánu takže jsem při čekání testoval ale nejspíš se plán jen posouvá tak raději posílám první pokus. U mne to funguje. Udělal jsem jen volací makro a bez úprav mi to chodí.


     Ještě detail. Jsou to odkazy. Podívejte se na volbu ÚPRAVY > ODKAZY NA EXTERNÍ SOUBORY. Takže odkazy lze rozpojit, ale když tam budou nové soubory se stejným jménem tak je vše v pohodě. Můžete také opakovat propojení.


Mnohokráte děkuji, problém je vyřešen. Koukal jsem již dřív a zkoušel a funguje to bez chyby jen sem minule nějak přehlédl ty odkazy a tak jsem dnes pátral a nevypátral v úpravách calcu jsou pouze šedivě odkazy a v makrech nic podobného a sic sem projel narychlo i ostatní nabídky nic jsem nenašel. Mimochodem se mi líbí že makro nehodí chybu když ten sešit nenajde prostě vloží list s textem bla bla něco... Sic neumím udělat podmínku že když neexistuje tak ho nevkládej a hodnotu celkem_pocet_dodavatelu poniž o jeden, ale jsem to schopen nacpat do makra až po vložení listu těžkopádné ale jistě to půjde a poté chci vytvořit (mimochodem myslel jsem si, že v libreoffice jde vytvořit okno formuláře takové jako se v Ecelu dělá ve VBA, ale nenašel jsem to) formulář zatím je jen v sešitě, kde mu zatržítkama vyberu které dodavatele chci vložit. Tuto podmínku jsme tuším schopen vložit. Byť jistě mnohem krkolomněji než profík smile
Takže návrhům se nebráním.

Prozatím všem děkuji za odpovědi.

Max

Offline

#8 8. 10. 2018 05:43:53

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

Re: InsertSheetFromFile

max2005 napsal(a)

... Sic neumím udělat podmínku že když neexistuje tak ho nevkládej a hodnotu celkem_pocet_dodavatelu poniž o jeden, ale jsem to schopen nacpat do makra až po vložení listu těžkopádné ale jistě to půjde

     Toto je jeden celkem malý detail který lze řešit celkem snadno. Jsou to ale odkazy které umí sice vytvořit list, ale pokud neexistuje zdroj, tak list neumí smazat. Je to dáno tím, že původní zadání bylo takto dáno - 4 soubory CSV = 4 listy.
     Ta druhá část upřesnění také není velký problém, ale už to není tak jednoznačné explicitní zadání. Běžně umím makrem otevřít zadaný adresář a postupně otevřít všechny soubory s definovanou příponou - tedy ve Vašem případě ".csv".
     Otevření znamená v tomto případě buď načtení odkazu (a nezobrazování původního čteného zdroje), nebo otevření do fokusu (přímé otevření dokumentu), a nebo jen skryté otevření a načtení celého, nebo části obsahu do některého typu dialogu. Tím je myšleno například snadné načtené části, celého obsahu, nebo jen názvu pokud podle názvu rozpoznáte oč jde. Pod pojmem dialog si musíme představit například okno MsgBoxu (který může mít 2, nebo 3 tlačítka kterými se rozhodne zda vložit či nikoliv), nebo InputBoxu (kterým by se ihned zadalo jméno listu - to by se muselo udělat u MsgBoxu jiným stylem, nebo InputBoxem). Ovšem obvyklejší je klasickým dialogem který může obsahovat například zaškrtávací tlačítka, nebo jiné ovládací prvky. Totéž lze udělat bez dialogu přímo do prvního listu, s tím že se tam vygenerují existující soubory podle názvu, nebo i s úryvkem, popřípadě s výsledkem hledání (například všechny soubory obsahující určitou položku ap.). Vedle mohou být zaškrtávací tlačítka, ale stačí tam jen například něco napsat, a nebo se jen postavit na příslušný řádek a stisknout klávesovou zkratku, a podobně.
     Zde je zakopaný pověstný pes. Musel bych se vyptávat na detaily typu "poznáte podle názvu zda chcete soubor načíst (nakopírovat)"?, "nebo potřebujete vidět náhled"?, "chcete nabídku postupně po jednom, nebo raději hned celý soupis existujících zdrojů"?, "Víte jak pojmenovat list v sešitě pro každý různý zdroj", "mají se původní listy zdrojů smazat a začít na zelené louce"?, není na místě místo otevírání mnoha zdrojů udělat předem těžbu podle seznamu - a zdroje bez nalezených obsahů smazat (nebo opak - profylaxe chtěných zdrojů do sešitu => každý den nový sešit)"?

a poté chci vytvořit (mimochodem myslel jsem si, že v LibreOffice jde vytvořit okno formuláře takové jako se v Excelu dělá ve VBA, ale nenašel jsem to) formulář zatím je jen v sešitě, kde mu zatržítkama vyberu které dodavatele chci vložit. Tuto podmínku jsme tuším schopen vložit. Byť jistě mnohem krkolomněji než profík smile
Takže návrhům se nebráním.

     Okno podle Vašich představ nejspíš vytvořit lze, ale já nemám představu co tím myslíte. Excel nemám a neznám - pro mne je to téměř sprosté slovo :-) Takže když postnete ukázku jako obrázek pochopím co se dá použít. Já celkem nemám problém vyřešit naznačenou potřebu mnoha různými způsoby, ale u Vás si nedovolím nic doporučovat pokud to není explicitně definované.
     Mám dokonce i několik hotových systémů pro eshopy, které jsem ale nedotáhl - tazatelé rezignovali na úplný systém. Spokojili se většinou jen s tím čemu rozuměli a zájem opadl hned jak dostali to čemu rozuměli přestože to byla vývojová verze. Jen pro představu : Nyní pracuji na projektu který vyhledává odborné termíny v řádově 150-ti uložených zdrojích .docx, .odt a internetové zdroje. Systém vrací většinou celou větu, nebo odstavec do dialogu aby lektor dovedl rozhodnout zda zdroj citovat a extrahovat pasáž (nebo je v dialogu klikačka na zdroj www). To je ale mnohdy útrpná dřina. Heslo se musí vytěžit zcela (nelze přerušit a navázat na rozdělanou rešerši). Je to pro edukativní účely a já těm odborným výrazům nerozumím. Nemohu to zjednodušit a když udělám report do výstupu Writeru tak to má někdy mnoho stran – tento postup je kontraproduktivní. Nejlepší je rychlá prohlížečka která umožňuje pokud možno co nejsnadnější informaci podle které se lektor rozhodne a například rešerši ihned ukončí.


     Proč to píšu - jakmile se dělá rešerše z různých zdrojů tak bývá nutné nejprve zdroje vyselektovat a z nich následně těžit. Tedy dvojstupňové vybírání. To už jsou skutečně profesionální a často komerční postupy kde už lze jen těžko hovořit o tom, že by se uživatel chtěl naučit programovat. Jde spíš jen o výsledek, ale nikoliv o cestu jak se k tomu dopracovat.
     Tím narážím na příspěvek pana Trnky který správně usoudil, že vše potřebné se dá najít v seriálu Dana Sedláčka - i když zřejmě jen v jediné variantě která nemusí tak úplně vyhovovat, ale seriál i když dle mne není dokončený je dost komplexní na to, aby si člověk poradil v mnoha různých případech. Doplním jen, že nejde jen o seriál Dana Sedláčka.


Takže abych to nějak uzavřel. Já to vidím jako potřebu šablony která by se jako nový soubor uložila do složky zdroje, automaticky načetla všechny existující soubory „.csv". Následně by podle seznamu výrazů v prvním listu buď načetla celý list pokud některý výraz obsahuje, nebo by citoval zdroj a vedle udělal výpis položky (řádku CSV).
     Nic mi do toho není ale chápu, že jde nejspíš o výpisy z eshopů, nebo o odpovědi z poptávek (v rámci rozpočtování), a nebo podobně výpisy z pokladního systému (více pokladen, nebo prodejen). V těchto nebo podobných případech bývá potřeba archivovat vývoj v čase, nebo porovnávat výhodnost kde nakoupit aj. Například se dá zpětně snadno dohledat jak se pohybovaly ceny, nebo zda dochází zboží na skladu a podobně. Takže systém práce odpovídá postupu > Vytvořit složku s názvem dne, nebo akce > do ní nakopírovat zdroje > uložit do této složky šablonu (ta se pojmenuje automaticky nejlépe podle složky + uloží také tam). Šablona se může jediným kliknutím spustit, vyhodnotit a poslat report například do Calcu který sleduje centrálně určitý okruh. Může to být propojení na Base pomocí registrovaného sešitu a podobně.
     Šablona celkem nic moc nepotřebuje protože si sama načte URL. Pouze se zadají vyhledávané výrazy. Je ale nutné zadat jak se mají zdroje vyhodnotit a jak seřadit po zpracování. To se obstará makrem které je možné upravovat na rozdíl od konstantních procesů načtení a spuštění které budou uzamčené.


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 9. 10. 2018 19:24:10

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: InsertSheetFromFile

Netušim jestli se obrázek zobrazí tak je dole když tak jen zkopírovaný odkaz na uložto.

Ty nespecifikované podmínky co mě postupně napadli jsou jen díky tomu, že puvodní postupné vkládání se vždy zeptalo a mě by nenapadlo že by to šlo taaak jednoduše smile takže pak postupně přidávám vždy to tvořím za běhu a dodělávám postupně nové a nové věci smile

Formulář je vytvořen tak že jakmile zaškrtunu Dobrovský tak se zobrazí volba jestli chci importovat soubor nebo to chci vložit ze schránky bohužel tento dodavatel neustále mění výslený soubor buď si ho musím zkopírovat či si ho tvořím na 2x a to pak z toho vznikne soubor. Bohužel na začlenění jak se to kurna jmenuje feedu který dokáže komunikovat s inshopem a tím aktualizovat online sklady nemáme navíc to samé zboží odebíráme od vícero dodavatelů a každý dodavatel vychrlí jiný soubor s eaný které nemá ty se porovnají s tím co jsme vyexportovali z pohody a výsledek je ty které již nemají odbyt to je jedninný (tedy alespoň jediný co nás napad) způsob jak jednoduše aktualizovat naše sklady.

Excel formulář
https://uloz.to/!lpC5ICGn9DcK/formular-png

Díky Max

Offline

#10 9. 10. 2018 20:10:43

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: InsertSheetFromFile

Aha už jsem na to možná přišel to se asi dělá v dialogových oknech no zkusím to.

Max

Offline

#11 10. 10. 2018 03:49:16

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

Re: InsertSheetFromFile

Ano jde o dialogová okna. Dejte ale pozor. Já testuji nejnovější Fresh verzi Libre Office, kde dialogová okna padají vždy při zavádění ovládacího prvku a nevím jestli to nebylo také u starších verzí.
     V nápovědě máte ukázky jak se spouští dialogová okna a jak se načítají obsahy jednotlivých prvků. Jinak je asi možné z Excelu hotový dialog vyexportovat a načíst. Nevím jestli se dialog zobrazí jako takový při otevření původního Excelu. Pak by stačilo přidat jen několik maker. Možná by stačilo přidat na začátek každého listu Basicu zaklínadlo VBA Support 1. Některá makra pak chodí v Libre Office.


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

#12 16. 10. 2018 08:15:59

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: InsertSheetFromFile

Narazil jsem na problem vládání těch listu funguje to je super použil jsem to i na vložení prvního listu na kterém se pak provádí upravy než se vyexportuje dodavatelům jenže list se sice vloži používám..

Sub Dialog2Show
Dim dlg As Object
Dim Cesta As Object
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")


DialogLibraries.LoadLibrary("Standard")
dlg = CreateUnoDialog( DialogLibraries.Standard.Dialog2 )
dlg.Execute()

x = dlg.model.Cesta.text
Rem dlg.dispose() - toto jsem zkusil přidat, ale to nepomohlo 
cUr_zasoby = x+"Zasoby1.csv"
ImportCSVPrepisList(cUr_zasoby , "Zasoby")
Rem přepnití se na list zásoby
dim vzoreck(0) as new com.sun.star.beans.PropertyValue
vzoreck(0).Name = "Nr"
vzoreck(0).Value = "Zasoby"
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, vzoreck())
..
..
End Sub

Sub ImportCSVPrepisList(ByVal cUrl as string, ByVal sList as string)
Dim oDoc
oDoc = ThisComponent
cFO = "59,,0,1,,1033,false,true"
'cFO = "59,[1. posice separátor] nyní středník (59), ale nejčastěji 44 (obyčejná čárka) 
'cFO = "59,,[2. pozice oddělovač textu] nyní prázdný, ale často uvozovky jednoduché (39), nebo dvojité (147) 
'Viz odkaz dole. Když to nebude fungovat musíte laborovat, ale myslím že to bude chodit bez úprav
cFN = "Text - txt - csv (StarCalc)"
    Mysh = ThisComponent.getSheets()
    if not Mysh.hasByName(sList) then Mysh.InsertNewByName(sList, 0)
    sh = Mysh.getByName(sList)
    sh.link(cUrl, sList, cFN, cFO, com.sun.star.sheet.SheetLinkMode.VALUE)
End Sub

Ale nevloží se aktivní čož jsem sice myslel že není potřeby vždyť ho mohu kdykoli vybrat jenže to nejde v calcu s ním normálně mohu pracovat list tam skutečně je ale makro ho prostě nevybere a to ani když vyskočím uplne z formuláře a použiji jiné makro.

Zkusil jsem použít i

oList = thisComponent.sheets.getByName("Zasoby")
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, oList())

ale to hodilo chybu BASIC - chyba při běhu.
Vyskytla se výjimka
Type: com.sun.star.lang.IllegalArgumentException
Message: cannot coerce argument type during corereflection call:
arg no.: 4 expected: "[]com.sun.star.beans.PropertyValue" actual: "void"

Někde sem musel udělat chybu, ale netuším kde.

Předem díky za pomoc.
Max

Offline

#13 16. 10. 2018 10:04:10

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

Re: InsertSheetFromFile

Já už si přesně nepamatuji jak to bylo s tím načítáním, ale pokud potřebujete skočit do sešitu, tak mám makro čistého Basicu a popíšu jak nahrát a upravit makro ze záznamníku :
A : Makro pro Basic

sub SkokNaSesit
	dim Document As Object 	
	dim Sheets As Object 	
	dim Sheet As Object 	
	Document = ThisComponent
	Sheets = Document.Sheets
	'Sheet = Sheets.getByName("Sheet2") 'Tohle je skok na sešit se jménem ve Vašem případě
        Sheet = Sheets.getByName("Zasoby")
	Controller =Document.getcurrentController
	Controller.setActiveSheet(Sheet) 
End sub

'_____________________________________________________
B - Makro pro basic

Sub Skok2
ThisComponent.CurrentController.ActiveSheet = ThisComponent.Sheets.getByName("Zásoby")
end sub

Při nahrávání skoku záznamníkem (řešení pomocí UNO) je postup takto :
1. Postavíte se někam do sešitu "Zasoby" (předpokládaný cíl) třeba do B2. Jistě víte kde potřebujete ve výsledku stát abyste například byl hned na buňce kterou budete číst. Postavte se ale někam blízko - ale vedle. To je příprava kterou využijete až nakonci nahrávání.
2. Nyní běžte na libovolně jiný list.
3. Zapnout záznamník - nahrávání makra.
4. Skočte do cílového listu (předpokládám Zásoby).
5. Přesuňte se na cílovou buňku a udělejte ENTER, Popřípadě SHIFT, a nebo také F2+Enter a podobně. Končíte vždy entrem.
6. Zastavíte nahrávání a správně uložíte pod vhodným jménem a na správné místo ve vlastním sešitě (ne aby Vás napadlo to ukládat do nadřazených maker "MojeMakraStandard").
7. Otevřete knihovnu. Musíte použít převod názvu listu na jeho číslo pořadí.
     Original nahrávka vypadá nějak takto :

sub Skok
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 1 'respektive jakékoliv číslo pořadí listu (malér možné záměny) to musíme 
'nejprve zjistit jiným makrem. 
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
end sub

Například takto zjistíme číslo ze jména a spojíme obě makra :

Sub SheetNameToNumber
Dim oSheets, i
oSheets = ThisComponent.Sheets()
For i = 0 to oSheets.Count-1
	IF oSheets(i).Name = "Zasoby" Then
	iVar = i
          'Pokud je hodně listů tak Exit For
	End If
Next i
Skok(iVar)
End sub

sub Skok(ByVal iVar as integer)
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = iVar
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
end sub


     Dělám to bez testů ale mělo by vše chodit. Snad je to to co opravdu potřebujete.


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 16. 10. 2018 21:21:52

max2005
Člen
Registrace: 1. 6. 2017
Příspěvků: 28

Re: InsertSheetFromFile

Ježiši kriste to jsem asi blbě vysvětlil a nebo to načtení bude složitější než jsem čekal.
Otevřu sešit zasoby v tomto sešitě je list Vysledek ten je samo aktivní spuštěním makra se tímto

cUr_zasoby = x+"Zasoby1.csv"
ImportCSVPrepisList(cUr_zasoby , "Zasoby")............

viz předešlé příspěvky se vloži prozatím 1list s názvem Zasoby aktivním listem však zůstává list Vysledek jenže já potřebuji aby se stal aktivním list Zasoby ma kterém se provedou další změny... jenže kód

dim vzoreck(0) as new com.sun.star.beans.PropertyValue
vzoreck(0).Name = "Nr"
vzoreck(0).Value = "Zasoby"
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, vzoreck())

se sice provede, ale aktivím (vybraným) listem zůstává stále Vysledek.

Pravě jsem zkusil nahrat makro a následně tedy použit kod s číslem a ejhle ono to jde ale to nechápu proč to nejde tím jménem. Proto jsem ty jmena chtěl abych mohl jednoznačně ty listy identifikovat.

Ale za kody díky to zjištění čísla z názvu lisu se může hodit.

Zatím díky max

Offline

#15 17. 10. 2018 15:17:34

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

Re: InsertSheetFromFile

Aha tohle použití jsem nepochopil správně. Jde to jednoduše jménem :-)

Sub HoplaZasoby
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "Zasoby.$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
End Sub

     Musíte toto makro přiřadit k události POHLED VYTVOŘEN (asi 9. položka z nabídky UDÁLOSTI). Testoval jsem to na LO Verze: 6.1.2.1 (x64).


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í