[SOLVED] Makro do wstawiania zewnętrznych danych

Użytkowanie arkusza kalkulacyjnego
Bri
Posty: 15
Rejestracja: pn lut 10, 2014 6:14 pm
Kontakt:

[SOLVED] Makro do wstawiania zewnętrznych danych

Post autor: Bri »

Mamy sporo raportów w postaci plików html. W każdym jest tak samo nazywająca się sekcja "html_pawel" - potrzebuje zrobić makro oparte na poleceniu wstaw > łącze do danych zewnętrznych. Powinno działać tak:
1. Zaznaczam komórkę
2. Klikam przycisk od uruchomienia makro
3. Wskazuję html w oknie dialogowym
4. Dane lądują w komórce i następnych komórkach w tym samym wierszu.
Powtarzam.

Nagrywałem już kilka makr, ale to czy działają czy nie jest dla mnie tajemnicą. Podgląd takiego makra w edytorze tekstowym też nie jest dla mnie zrozumiały (np. nie ma tam żadnej ścieżki do pliku). Przykładowo nagrane makro:

Kod: Zaznacz cały

sub html
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 ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:InsertExternalDataSource", "", 0, Array())
end sub
Ostatnio zmieniony wt lut 18, 2014 11:55 am przez Bri, łącznie zmieniany 1 raz.
Win7 / LO 5.x / MSO2007 / MSO 2010
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Makro do wstawiania zewnętrznych danych

Post autor: belstar »

Twoje nagrane makro robi dokładnie - NIC, to co miało wstawić dane zewnętrzne jest wyłączone i brak jeszcze argumentów (nazwa filtra, ścieżka) . Spróbuj mistrza Pitonyak-a Link.
W razie problemów postaram się pomóc, oczywiście w miarę wolnego czasu, choć z tym jest teraz krucho.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Bri
Posty: 15
Rejestracja: pn lut 10, 2014 6:14 pm
Kontakt:

Re: Makro do wstawiania zewnętrznych danych

Post autor: Bri »

Coś mi się wydaje że nie można zaprogramować w makro wewnętrznego działania funkcji wstawiania danych. Uważam że dlatego iż wywoływana jest tylko jedna funkcja:

Kod: Zaznacz cały

dispatcher.executeDispatch(document, ".uno:InsertExternalDataSource", "", 0, Array())
Co ciekawe każde nagrywanie makro skutkuje że ta funkcja jest wygaszona

Kod: Zaznacz cały

rem dispatcher.executeDispatch(document, ".uno:InsertExternalDataSource", "", 0, Array())
Obawiam się że tu trzeba by było własną funkcję zrobić i operować opendialogiem.
Win7 / LO 5.x / MSO2007 / MSO 2010
Bri
Posty: 15
Rejestracja: pn lut 10, 2014 6:14 pm
Kontakt:

Re: Makro do wstawiania zewnętrznych danych

Post autor: Bri »

Witajcie
Namierzyłem takie macro:

Kod: Zaznacz cały

Sub InsertWebLinkAtSelection(url As String)
   Dim oDoc As Object
   Dim oSelection
   Dim oAddress As new com.sun.star.table.CellAddress
   
   oDoc = ThisComponent
   oSelection = oDoc.getCurrentController().getSelection()
   if oSelection.supportsService("com.sun.star.sheet.SheetCell") then
      oAddress = oSelection.getCellAddress()
      oDoc.AreaLinks.insertAtPosition(oAddress,url,"HTML_all","calc_HTML_WebQuery","0 0")
   endif

End Sub
Potrzebuje do niego tylko pliku z którego chce pobrać dane.
Zatem pytanie - jak wywołać okno dialogowe otwierania pliku (przeglądania w poszukiwaniu pliku) i jak z niego później wyciągnąć adres pliku żeby użyć go jako url w macro powyżej ???
Win7 / LO 5.x / MSO2007 / MSO 2010
Smaigas
Posty: 135
Rejestracja: czw lut 04, 2010 8:43 am
Lokalizacja: Lietuva (Litwa), Vilnius (Wilno)

Re: Makro do wstawiania zewnętrznych danych

Post autor: Smaigas »

Wyrwaem ze swojego

Kod: Zaznacz cały

...
oDocument=ThisComponent
oRange= oDocument.CurrentSelection.RangeAddress
oSheet=oDocument.getCurrentController().getActiveSheet()
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
oFileDialog.appendFilter( "*.GSI","*.gsi")
oFileDialog.appendFilter( "*.txt", "*.txt" )
oFileDialog.appendFilter( "*.*", "*.*" )
iAccept = oFileDialog.Execute()
If iAccept = 1 Then 'jeżeli zaznaczono plik i naciśnieto "Otwórz"
sPath =ConvertFromURL(oFileDialog.Files(0)) 'zwraca ścieżkę do pliku
cDirectoryURL =ConvertFromURL(oFileDialog.getDisplayDirectory())
...

Version: 5.2.5.1 Build ID: 0312e1a284a7d50ca85a365c316c7abbf20a4d22
Windows XP PRO SP3
Bri
Posty: 15
Rejestracja: pn lut 10, 2014 6:14 pm
Kontakt:

Re: Makro do wstawiania zewnętrznych danych

Post autor: Bri »

Wielkie dzięki.
Złożyłem to w całość, usunąłem zdublowane oDocument=this.component, podstawiłem cDirectoryURL.
Ale jednak dostaję "Łącze nie mogło zostać zaktualizowane".
Pomyślałem że to raczej chyba powinno być w użyciu sPath, wtedy calc zaczął mnie informować o tym że makra nie można uruchomić ze względu na poziom zabezpieczeń ;)
Po zredukowaniu poziomu bezpieczeństwa, niestety "Łącze nie mogło zostać zaktualizowane".

Użyłem takiej postaci ostatecznie.

Kod: Zaznacz cały

sub r2

oDocument = ThisComponent
oSelection = oDocument.getCurrentController().getSelection()
oAddress = oSelection.getCellAddress()

oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
oFileDialog.appendFilter( "*.HTML","*.html")
oFileDialog.appendFilter( "*.*", "*.*" )
iAccept = oFileDialog.Execute()

If iAccept = 1 Then 'jeżeli zaznaczono plik i naciśnieto "Otwórz"
oDocument.AreaLinks.insertAtPosition(oAddress,oFileDialog.Files(0),"HTML_pawel","calc_HTML_WebQuery","0 0")
end if

end sub
Abo za bardzo obciąłem albo jednak wywoływanie calc_HTML_WebQuery nie działa tak jak uno:InsertExternalDataSource.

-----------------------

Ok wiem że adres oFileDialog.Files(0) ma złą postać bo jest w zapisie file:///dysk:/folder/plik. A potrzebuję dysk:\folder\plik.
Właściwa postać to sPath. Ale nie łapie.

------------------------

DZIAŁA!

Kod: Zaznacz cały

oDocument.AreaLinks.insertAtPosition(oAddress,oFileDialog.Files(0),"HTML__pawel","calc_HTML_WebQuery","0 0")
Jak najbardziej ma być oFileDialog.Files(0).
Ale dopiero po sprawdzeniu postaci łącz w pliku (menu edycja > łącza) zauważyłem że w nazwie zakresu danych maja być dwa pokreślenia.
Tabelka w pliku html nazywa się "pawel" (zarówno id jak i name dla bezpieczeństwa). Wskazując ją ręcznym wstawianiem zewnętrznych danych nie zwracałem na to uwagi - po prostu był zakres który wskazywałem i miałem dane.
W makro musiało być zapisane w postaci pierwszej.

Kod: Zaznacz cały

1) HTML__pawel 
2) HTML_pawel
I teraz mam makro importujące :)
Kłaniam się nisko.
Win7 / LO 5.x / MSO2007 / MSO 2010
tsandomierski
Posty: 2
Rejestracja: czw wrz 24, 2015 9:13 am

Re: [SOLVED] Makro do wstawiania zewnętrznych danych

Post autor: tsandomierski »

Czy jest możliwość by to makro zczytywalo ulre z listy zewnętrznej/komórki i cały wynik/poszukiwaną fraze umieszczało w jednej komórce obok tak by tworzyła się lista:
URL - treść strony/wybrana fraza
URL 2 - treść strony 2/wybrana fraza
itd
LibreOffice 4.1.3.2 na Windows 7
ODPOWIEDZ