Makro zapisu .doc

Użytkowanie edytora dokumentów
whoszek
Posty: 3
Rejestracja: śr mar 07, 2018 8:59 pm

Makro zapisu .doc

Post autor: whoszek »

Cześć,
Chcę zrobić makro, które zapisze aktualnie otwarty dokument .odt w podkatalogu /doc jako plik Worda 97.
Zrobiłem tyle co poniżej, lecz plik jest zapisany w tym samym katalogu z nazwą "plik.odt.doc". Jak to zrobić żeby było w podkatalogu /doc i nazwą "plik.doc"?
Katalog z aktualnym plikiem się zmienia, ale pliki .doc zawsze mają lądować w podkatalogu /doc.

Kod: Zaznacz cały

REM  *****  BASIC  *****

Sub Main

End Sub




sub Save_as_doc
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(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = ThisComponent.getURL() & ".doc"
args1(1).Name = "FilterName"
args1(1).Value = "MS Word 97"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())


end sub
Pozdrawiam,
Wojtek
OpenOffice 4.1.5 na Windows 7 Pro x64
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisu .doc

Post autor: Jan_J »

url = ThisComponent.getURL()
Brutalnie (obcinamy 4 końcowe znaki, licząc że są to ".odt")
nazwa = left(url, len(url)-4) & ".doc"

Nieco więcej finezji (obcinamy na pierwszej kropce)
nazwa = left(url, instr(url, ".")-1) & ".doc"

Oba sposoby mogą się okazać mocno mylące w nietypowych, choć legalnych przypadkach. Np.
file:///c:/dane.moje.odt --> file:///c:/dane
file:///c:/dane.moje/raz_dwa --> file:///c:/dane

Jeszcze lepiej zatem obciąć na ostatniej kropce, ale tylko o ile występuje po ostatnim ukośniku.

W porządnym języku winna być biblioteka działań tekstowych na ścieżkach. Basic takowej nie posiada, jeśli ktoś chce, może sobie poprogramować.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
whoszek
Posty: 3
Rejestracja: śr mar 07, 2018 8:59 pm

Re: Makro zapisu .doc

Post autor: whoszek »

Dzięki :)
Wybieram wersję brutalną. Tylko w którym miejscu mam to wkleić do makra? I jak go przekonać żeby plik.doc zapisał w podkatalogu /doc katalogu w którym jest plik.odt?
OpenOffice 4.1.5 na Windows 7 Pro x64
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro zapisu .doc

Post autor: Jermor »

Jan_J pisze:nazwa = left(url, 4) & ".doc"
Szanowny Janie_J czy nie powinno to być raczej tak:
nazwa = left(url, len(url)-4) & ".doc"
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro zapisu .doc

Post autor: Jermor »

Nazwa pliku znajduje się po ostatnim ukośniku. Aby go znaleźć a następnie dopisać po nim nazwę katalogu i zmodyfikowaną nazwę pliku możesz napisać taki kod

Kod: Zaznacz cały

REM szukanie ostatnigo ukośnika
for i=1 to len(url)
if mid(url,i,1)="/" then j=i
next
REM pozycja ostatniego ukośnika jest w j, długość ciągu w i
REM wyznaczenie ostatecznego miejsca zapisu
url=left(url,j) & "doc/" & mid(url,j+1,i-j-5) & ".doc"
[edit] poprawiłem błąd w ostatnim wierszu kodu.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro zapisu .doc

Post autor: Jermor »

Gdzie dodać?
W sekcji definiowania zmiennych dopisz:

Kod: Zaznacz cały

dim i as integer, j as integer, url as string
Po pierwszym dispacher
dopisz instrukcję podaną przez Jana_J

Kod: Zaznacz cały

url=ThisComponent.getURL()
po niej cały kod podany przeze mnie
no i w końcu w argumentach, w pozycji Value wpisz

Kod: Zaznacz cały

Value=url
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
whoszek
Posty: 3
Rejestracja: śr mar 07, 2018 8:59 pm

Re: Makro zapisu .doc

Post autor: whoszek »

Dziękuję :bravo:
Jesteście wielcy :D
Makro działa tak jak chciałem.
Dla potomnych wkleję je w całości. Może się komuś przyda.

Kod: Zaznacz cały

REM  *****  BASIC  *****

Sub Main

End Sub

sub Save_as_doc
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
dim i as integer, j as integer, url as string
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
url=ThisComponent.getURL()
REM szukanie ostatnigo ukośnika
for i=1 to len(url)
if mid(url,i,1)="/" then j=i
next
REM pozycja ostatniego ukośnika jest w j, długość ciągu w i
REM wyznaczenie ostatecznego miejsca zapisu
url=left(url,j) & "doc/" & mid(url,j+1,i-j-5) & ".doc"

rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = url
args1(1).Name = "FilterName"
args1(1).Value = "MS Word 97"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())

end sub
Dziękuję bardzo za pomoc. :super:
OpenOffice 4.1.5 na Windows 7 Pro x64
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisu .doc

Post autor: Jan_J »

Jermor pisze:czy nie powinno to być raczej tak:
nazwa = left(url, len(url)-4) & ".doc"
Jasne; dzięki, poprawiłem.
// przed wysłaniem podpowiedzi zrobiłem szybki test poprawności! tylko że na przykładzie "kuku.odt" :) nie miał niestety rangi dowodu!
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2254
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Makro zapisu .doc

Post autor: Jermor »

Jan_J pisze:W porządnym języku winna być biblioteka działań tekstowych na ścieżkach. Basic takowej nie posiada...
Jednak coś jest. Z zainstalowaniem pakietu związana jest także instalacja bibliotek przedstawiających się w drzewie obiektów jako "Makra i okna dialogowe LibreOffice" (albo OpenOffice w Apache OpenOffice).
Wydaje mi się, że nie trzeba ich specjalnie deklarować i makra powinny być dostępne z poziomu aplikacji. W bibliotece "Tools" tego zestawu znajdują sie między innymi następujące makra:
aby otrzymać pełną nazwę pliku: FilenameOutofPath(url)
Aby otrzymać rozszerzenie nazwy: GetFilenameExtension(url)
Aby otrzymać nazwę pliku bez rozszerzenia: GetFilenamewithoutExtension(url,"/")
Aby otrzymać tylko ścieżkę do pliku: DirectoryNameoutofPath(url,"/")
W dwóch ostatnich makrach jako drugi parametr należy podać separator wyznaczający strukturę zapisu.
Gdyby jednak wskazanie biblioteki było niezbędne można to zrobić następującą instrukcją:

Kod: Zaznacz cały

GlobalScope.BasicLibraries.LoadLibrary("Tools")
Ponadto w samym Basicu mamy dwie instrukcje:
ConverttoURL(ścieżka z plikiem)
ConvertfromURL (url)
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisu .doc

Post autor: Jan_J »

Czytać dokumentację, zamiast narzekać.
// to do mnie ...
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ