Witam,
pracuję ostatnio w swoim programie nad tworzeniem raportu z obliczeń w LibreOffice/OpenOffice (wcześniej raport tworzyłem tylko w MS Word).
O ile udało mi się w zasadzie osiągnąć zamierzony cel i efekt (co nie było łatwe - API LibreOffice/OpenOffice jest bardzo chimeryczne, pod tym względem MS Word jest bardziej przewidywalny - bardzo ułatwiła sprawę biblioteka OOo Tool: http://berma.pagesperso-orange.fr/index2.html), to mam jeszcze dwa nierozwiązane problemy (po przeszukaniu różnych forów, google, itp. nie udało mi się niestety znaleźć żadnych podpowiedzi):
- w jaki sposób można sprawdzić że jest już otwarty dokument Writer (nie chcę aby program za każdym razem tworzył nowy dokument, idea jest taka aby raport był wklejany (OLE) do otwartego dokumentu, chyba że go nie ma to wtedy nowy dokument jest tworzony i raport wklejany).
Aktualnie mój kod wygląda tak:
var
myDoc, myText, myCursor: Variant;
begin
ConnectOpenOffice;
myDoc:= StarDesktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, dummyArray);
myText:= myDoc.Text;
myCursor:= myText.createTextCursor;
Procedura ConnectOpenOffice (OOo Tools):
procedure ConnectOpenOffice;
begin
if IsOpenOfficeConnected then exit;
Screen.Cursor:= crHourglass; Application.ProcessMessages;
try
OpenOffice:= CreateOleObject('com.sun.star.ServiceManager');
if isNullEmpty(OpenOffice) then Raise EOOoError.Create(OOo_connectKO);
StarDesktop:= CreateUnoService('com.sun.star.frame.Desktop');
disp:= CreateUnoService('com.sun.star.frame.DispatchHelper');
OOoIntrospection:= CreateUnoService('com.sun.star.beans.Introspection');
OOoReflection:= CreateUnoService('com.sun.star.reflection.CoreReflection');
OOoTypeDescrMngr:= OpenOffice.DefaultContext.getValueByName('/singletons/com.sun.star.reflection.theTypeDescriptionManager');
finally
Screen.Cursor:= crDefault;
end;
end;
- Różne parametry w LibreOffice/OpenOffice Witer zapisywane są często jako rekordy/typ wariantowy ('com.sun.star.beans.PropertyValue'). Przy generowaniu raportu potrzebuję zmienić wartości odstępu między wierszami dla nowej linii (paragrafu), przykładowo (wykorzystanie procedur i funkcji z OOo Tools):
execDispatch('.uno:LineSpacing', CreateProperties(['LineSpacing.Mode', 0, 'LineSpacing.Height', 100]));
albo
execDispatch('.uno:SpacePara15', dummyArray);
Chodzi o to że po wygenerowaniu raportu chciałbym przywrócić pierwotną wartość odstępu między wierszami (dobra praktyka), czyli chciałbym przed wygenerowaniem raportu odczytać (poprzez API LibreOffice/OpenOffice) aktualną wartość odstępu między wierszami (LineSpacing) a potem (po wygenerowaniu raportu) ją przywrócić. Nie udało mi się nigdzie znaleźć wskazówki jak można to zrobić (własne różne kombinacje nie przyniosły efektu).
Będę bardzo wdzięczny za każdą wskazówkę, to jest mój pierwszy post na tym forum, więc bardzo proszę o wyrozumiałość..
Pozdrawiam!