[SOLVED] Obramowanie generowanej tabeli.

Użytkowanie arkusza kalkulacyjnego
Altaro
Posty: 37
Rejestracja: czw paź 26, 2023 10:13 am

[SOLVED] Obramowanie generowanej tabeli.

Post autor: Altaro »

Witam, czy Libre Office, za pomocą funkcji

Kod: Zaznacz cały

oTabela.getCellRangeByPosition(kol,wierszeAB+2,kol,rowsCount).HoriJustify=com.sun.star.table.borderLine.Color = RGB(95, 77, 255) 
Mogę utworzyć obramowanie komórki? wystarczy zwykłe czarne obramowanie powstającej tabeli.

Najchętniej, sprawdzałbym w pętli "Do While" komórki od 12 wiersza, aż do pustej komórki, które zaznaczałbym w zakresie (1 kolumna, 12 wiersz, do 4 kolumny, aż do pustego wiersza -1), tworzyłbym obramowanie tej tabeli. Czy to dobry pomysł? O ile z pętlą nie problem sobie poradzić, to jak zaimplementować funkcję BorderLine?
Ostatnio zmieniony czw kwie 25, 2024 11:21 am przez Altaro, łącznie zmieniany 1 raz.
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2352
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Obramowanie generowanej tabeli.

Post autor: Jermor »

No nie, to nie jest ta właściwość."HoriJustify" to właściwość określająca poziome wyrównanie tekstu w komórce. Za obramowania odpowiada właściwość xBorder, w której "x" określa krawędź obramowania. Przedstawiam ci propozycję makra.
Założyłem, że w twojej tabeli pierwsza kolumna i pierwszy wiersz określają rozmiar tabeli, poprzez znalezienie położenie pierwszej pustej komórki. Mój przykład zakłada, że tabela zaczyna się w komórce o współrzędnych podanych zmiennymi "tsk" i "tsw".
Dwie pętle Do — Loop wyznaczają liczbę wierszy i kolumn, a następnie obszarowi wynikającemu z tych rozmiarów przypisywane są krawędzie.
BorderLine jest zdefiniowaną strukturą, a nie funkcją.

Kod: Zaznacz cały

Sub Ramki
Dim aBorder as New com.sun.star.table.BorderLine2
Dim oCells as Object, oArk as Object, oDok as Object, oCell as Object    ' Obszar w tabeli.
tsw=12 'startowy nr wiersza tabeli (liczony od 0)
tsk=2 'Startowy nr kolumny tabeli (liczony od 0)
With aBorder
	  .Color=0 '0=czarny
	  .LineWidth=50 'grubośc linii w setnych milimetra
	  .LineStyle=0
End With  
oDok=ThisComponent
oArk=oDok.Sheets(0)
'Policzenie ile jest wierszy i kolumn
liczbawierszy=0
Do 
oCell=oArk.getCellByPosition(tsk, tsw+liczbawierszy)
If oCell.string="" then Exit Do
liczbawierszy=liczbawierszy+1
Loop While oCell.string <>""
LiczbaKolumn=0
Do
oCell=oArk.getCellByPosition(tsk+LiczbaKolumn, tsw)
If oCell.string="" then Exit Do
LiczbaKolumn=LiczbaKolumn+1
Loop While oCell.string<>""
'Zdefiniowanie zakresu i przypisanie linii krawędzi
 oCells=oArk.getCellRangeByPosition(tsk,tsw,tsk+liczbakolumn-1,tsw+liczbawierszy-1)
with oCells 'Obramowanie każdej komórki w obszarze
	.BottomBorder=aBorder
	.TopBorder=aBorder
	.LeftBorder=aBorder
	.RightBorder=aBorder
End With
End Sub
AOO 4.1.15, LO 24.8.2 (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.
Altaro
Posty: 37
Rejestracja: czw paź 26, 2023 10:13 am

Re: Obramowanie generowanej tabeli.

Post autor: Altaro »

Jako że u mnie liczba kolumn jest stała, trochę uprościłem kod i dostosowałem go tak, by jeśli w którejkolwiek z kolumn w wierszu, jest wartość, to również ma tworzyć obramowanie w całym wierszu.

Kod: Zaznacz cały

Sub Ramki
Dim aBorder as New com.sun.star.table.BorderLine2
Dim oCells as Object ' Obszar w tabeli.
tsw=13 'startowy nr wiersza tabeli (liczony od 0)
tsk=0 'Startowy nr kolumny tabeli (liczony od 0)
kolumny=3 'stała liczba kolumn, wynikająca ze struktury tabeli
With aBorder
	  .Color=0 '0=czarny
	  .LineWidth=20 'grubośc linii w setnych milimetra
	  .LineStyle=0
End With  

'Policzenie ile jest wierszy i kolumn
liczbawierszy=0
Do While oTabela.getCellByPosition(tsk, tsw+liczbawierszy).string<>"" or oTabela.getCellByPosition(tsk+1, tsw+liczbawierszy).string<>"" or oTabela.getCellByPosition(tsk+2, tsw+liczbawierszy).string<>"" or oTabela.getCellByPosition(tsk+3, tsw+liczbawierszy).string<>""
liczbawierszy=liczbawierszy+1
Loop

'Zdefiniowanie zakresu i przypisanie linii krawędzi
 oCells=oTabela.getCellRangeByPosition(tsk,tsw,kolumny,tsw+liczbawierszy-1)
with oCells 'Obramowanie każdej komórki w obszarze
	.BottomBorder=aBorder
	.TopBorder=aBorder
	.LeftBorder=aBorder
	.RightBorder=aBorder
End With
End Sub
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2352
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: [SOLVED] Obramowanie generowanej tabeli.

Post autor: Jermor »

OK.
Jeśli chodzi liczbę kolumn, to jeśli występują trzy kolumny, jak to ustalasz w zmiennej "kolumna", to numerami tych kolumn są liczby: 0,1 i 2 (bo tabelka zaczyna się w kolumnie 0), czyli w instrukcji

Kod: Zaznacz cały

oCells=oTabela.getCellRangeByPosition(tsk,tsw,kolumny,tsw+liczbawierszy-1
Powinieneś wpisać: kolumny-1, bo w przeciwnym razie obramowujesz 4 kolumny.
W instrukcji Do analizujesz cztery kolejne komórki w wierszu, czyli 4 kolumny (a nie trzy jak określa to zmienna "kolumny"). Ponieważ chcesz tylko sprawdzić, czy gdziekolwiek w wierszu jest jakiś wpis to, zamiast sprawdzać każdą komórkę oddzielnie, możesz zapisać warunek While tak:

Kod: Zaznacz cały

Do While oTabela.getCellByPosition(tsk, tsw+liczbawierszy).string & oTabela.getCellByPosition(tsk+1, tsw+liczbawierszy).string _
 & oTabela.getCellByPosition(tsk+2, tsw+liczbawierszy).string & oTabela.getCellByPosition(tsk+3, tsw+liczbawierszy).string <>""
AOO 4.1.15, LO 24.8.2 (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.
Altaro
Posty: 37
Rejestracja: czw paź 26, 2023 10:13 am

Re: [SOLVED] Obramowanie generowanej tabeli.

Post autor: Altaro »

Wszystko działa. Dziękuję!
Win 10
LibreOffice 7.1.3.2 x64
ODPOWIEDZ