[SOLVED] Makro "zapisz kopię" w LibreOffice

Użytkowanie arkusza kalkulacyjnego
jarecki2222
Posty: 8
Rejestracja: śr paź 16, 2019 1:45 pm

[SOLVED] Makro "zapisz kopię" w LibreOffice

Post autor: jarecki2222 »

cwolan pisze:

Kod: Zaznacz cały


sub ZapiszKopie
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "FilterName"
args1(0).Value = "Text - txt - csv (StarCalc)"
args1(1).Name = "FilterOptions"
args1(1).Value = "44,34,ANSI,1,,0,false,true,true"

FileURL = "file:///I:/plik.csv"
ThisComponent.storeToURL(FileURL,args1())

end sub

Jan_J pisze:Dla porządku dołączam link do dokumentacji opcji filtra:
https://wiki.openoffice.org/wiki/Docume ... CSV_Filter
Dziękuję za powyższe informacje...




Zarejestrowałem / nagrałem makro (bo pisać nie umiem), które zapisuje dokument jako plik csv "zapisz jako" i działa ono poprawnie:

Kod: Zaznacz cały

sub ZapiszJako
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(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///I:/plik.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true"

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
end sub
Nagrałem tak samo makro które miało zapisywać kopię dokumentu jako plik csv "zapisz kopię", ale nie działa, otwiera tylko okno dialogowe i koniec:

Kod: Zaznacz cały

sub ZapiszKopie
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SaveACopy", "", 0, Array())
end sub
Wkleiłem do pierwszego makra:
dispatcher.executeDispatch(document, ".uno:SaveACopy", "", 0, args1())
zamiast
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
( i ostatni parametr zamieniłem z Array na args).

Makro wygląda jak poniżej i nie działa:

Kod: Zaznacz cały

sub ZapiszKopie
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(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///I:/plik.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true"

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SaveACopy", "", 0, args1())
end sub
Ostatnio zmieniony sob lut 27, 2021 5:59 am przez jarecki2222, łącznie zmieniany 1 raz.
OpenOffice 4.17 na Windows 10. Przesiadka do LibreOffice 7.1. Z Trabanta do Opla.
cwolan
Posty: 54
Rejestracja: pn sty 25, 2021 11:17 pm

Re: Makro "zapisz kopię" w LibreOffice

Post autor: cwolan »

Kod: Zaznacz cały


sub ZapiszKopie
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "FilterName"
args1(0).Value = "Text - txt - csv (StarCalc)"
args1(1).Name = "FilterOptions"
args1(1).Value = "44,34,ANSI,1,,0,false,true,true"

FileURL = "file:///I:/plik.csv"
ThisComponent.storeToURL(FileURL,args1())

end sub

OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 7.6.6
Windows 7,10,11 64-bit
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro "zapisz kopię" w LibreOffice

Post autor: Jan_J »

Dla porządku dołączam link do dokumentacji opcji filtra:
https://wiki.openoffice.org/wiki/Docume ... CSV_Filter
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
cwolan
Posty: 54
Rejestracja: pn sty 25, 2021 11:17 pm

Re: Makro "zapisz kopię" w LibreOffice

Post autor: cwolan »

@Jan_J: Dziękuję za podanie linku do dokumentacji - sam powinienem był o tym pomyśleć. :oops:

Poniżej - również dla porządku - interesujący fragment kodu źródłowego LibreOffice:

Kod: Zaznacz cały

uno::Reference<frame::XStorable> xDocStorable(mxComponent, uno::UNO_QUERY_THROW);

// Save a copy
utl::TempFile aTempFileSaveCopy;
aTempFileSaveCopy.EnableKillingFile();
uno::Sequence<beans::PropertyValue> descSaveACopy(comphelper::InitPropertySequence(
    { { "SaveACopy", uno::Any(true) }, { "FilterName", uno::Any(OUString("calc8")) } }));
xDocStorable->storeToURL(aTempFileSaveCopy.GetURL(), descSaveACopy);
Link do pliku (od lini 682)
https://opengrok.libreoffice.org/xref/c ... 7ecc98#682
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 7.6.6
Windows 7,10,11 64-bit
ODPOWIEDZ