Strona 1 z 1

[SOLVED] Makro "zapisz kopię" w LibreOffice

: pt lut 19, 2021 11:46 pm
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

Re: Makro "zapisz kopię" w LibreOffice

: sob lut 20, 2021 1:56 pm
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


Re: Makro "zapisz kopię" w LibreOffice

: ndz lut 21, 2021 10:55 pm
autor: Jan_J
Dla porządku dołączam link do dokumentacji opcji filtra:
https://wiki.openoffice.org/wiki/Docume ... CSV_Filter

Re: Makro "zapisz kopię" w LibreOffice

: ndz lut 21, 2021 11:36 pm
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