Построение таблицы в LibeOffice

Автор Massaraksh7, 12 октября 2024, 01:49

0 Пользователи и 1 гость просматривают эту тему.

Massaraksh7

Пытаюсь построить таблицу в LibreOffice (с помошью границ).
Таблица прямоугольная, но нерегулярная. Как на рисунке. Делаю это так: в процессе построения рисую горизонтальные линии по каждой нужной строке через процедуру:
sBorder = "BottomBorder"
aBorder=sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).getPropertyValue(sBorder)
aBorder.LineWidth=w
sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).setPropertyValue(sBorder,aBorder)
А после завершения - вертикальные на всю высоту таблицы.
sBorder = "LeftBorder"
aBorder=sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).getPropertyValue(sBorder)
aBorder.LineWidth=w
sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).setPropertyValue(sBorder,aBorder)
Только вот после этого горизонтальные линии затираются.
Что делаю не так? Как правильно сделать?

Massaraksh7

Вроде бы, решил проблему. Вот так - работает нормально.
if br=1 then
  aBorder=sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder
  aTheLine = aBorder.LeftLine
  aTheLine.InnerLineWidth = w
  aBorder.LeftLine = aTheLine
  sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder = aBorder
endif
if br=2 then
  aBorder=sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder
  aTheLine = aBorder.RightLine
  aTheLine.InnerLineWidth = w
  aBorder.RightLine = aTheLine
  sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder = aBorder
endif
if br=4 then
  aBorder=sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder
  aTheLine = aBorder.TopLine
  aTheLine.InnerLineWidth = w
  aBorder.TopLine = aTheLine
  sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder = aBorder
endif
if br=8 then
  aBorder=sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder
  aTheLine = aBorder.BottomLine
  aTheLine.InnerLineWidth = w
  aBorder.BottomLine = aTheLine
  sheet.getCellRangeByPosition(c1-1,r1-1,c2-1,r2-1).TableBorder = aBorder
endif
Но, непонятно, почему первоначальный вариант не заработал?

mikekaganski

#2
Для того чтобы проверить Ваш код, потребовалось бы добавить всё недостающее. Возможно, кто-то и заморочится и проделает всю эту работу, только лишь для того чтобы воспроизвести то, что у Вас уже есть ... Если Вы не стараетесь ограничить круг отвечающих только теми, кто готов тратить своё время на самостоятельное восполнение недостающей информации, и теми, кто знает ответ наизусть без тестирования (я точно не отношусь ни к первым, ни ко вторым) - возможно, стоило бы приложить файл ODS с готовым макросом. Тогда будет проще ответить "почему первоначальный вариант не заработал".
С уважением,
Михаил Каганский

Massaraksh7

Ну и ладно, заработало, и мой вопрос плавно перешёл в разряд риторических. Мои задачи это решает, а больше мне на данный момент и не надо.

Massaraksh7

Поковырялся таки, и разобрался, в чём дело. Многословно рассказывать не буду (sapienti sat), обращу внимание тех, кто будет сталкиваться с аналогичными проблемами, что у TableBorder помимо свойств LeftLine, RightLine, TopLine, BottomLine есть свойства HorizontalLine и VerticalLine, и, кроме того, у всех у них, в свою очередь, есть свойства IsLeftLineValid, IsRightLineValid, IsTopLineValid, IsBottomLineValid, IsHorizontalLineValid, IsVerticalLineValid, и все они важны, за ними тоже нужно следить, и при чтении из Range они могут быть предустановлены достаточно причудливо.

Massaraksh7

#5
Попробую проиллюстрировать.Составлю простенький пример, Макрос Borders, две подпрограммы: BBorder для рисования нижних границ, и LBorders для рисования левых границ. Макрос в цикле строит 4 вертикальных и 4 горизонтальных линии (рисунок 1). Всё, вроде бы замечательно.

Но теперь мы хотим, чтобы нижняя линия была жирной, окей, раскомментируем строку 15 и что мы видим? (рисунок 2). Никакой жирной линии не появилось, напротив, исчезла самая нижняя линия.

Ладно, добавляем строку 23, и пытаемся ещё раз, и, ура, жирная линия появляется (рисунок 3).

А теперь хотим, чтобы жирная линия было на одну ячейку длиннее, изменяем 4 параметр в вызове BBorders в строке 15, и... всё ломается (рисунок 4), жирная линия вообще не прорисовывается. Что же делать?

Добавляем строку 25 в код, и, наконец, получаем то, что хотим (рисунок 5).

P.S.: Очень жаль, что нет нормальной документации.

Massaraksh7


Massaraksh7


mikekaganski

Цитата: Massaraksh7 от 13 октября 2024, 07:32P.S.: Очень жаль, что нет нормальной документации.

Не знаю, какие конкретно критерии у "нормальности" документации, но существующая документация здесь (а для свойств *Border2, доступных с версии 3.6 и включающих стиль линий - здесь).
С уважением,
Михаил Каганский

Massaraksh7

Это перечень свойств с очень кратким описанием, в практическом применении бесполезным. Вся эта информация уже есть в наименовании свойств, которые можно почерпнуть в режиме отладки.

mikekaganski

#10
Цитата: Massaraksh7 от 13 октября 2024, 09:07Это перечень свойств с очень кратким описанием, в практическом применении бесполезным. Вся эта информация уже есть в наименовании свойств, которые можно почерпнуть в режиме отладки.

Хе, не могу удержаться, чтобы не спародировать Ваш отзыв:

Ваш отзыв - это перечень того, чем Вы считаете существующую документацию, не указывающий, а что там должно быть вместо (или вместе) с этим. (Блин, для истинной пародии мне не надо было указывать, чего там не хватает ... уж извините ;) )

Ещё есть LibreOffice Developer's Guide (например, его раздел о форматировании ячеек).

И вообще ресурсы документации по программированию собраны здесь.
С уважением,
Михаил Каганский

Massaraksh7

Михаил, назначение документации - писать работающие приложения, на основе знаний, полученных из неё.
Возвращаясь к описанному мной примеру: где в документации указано, что если линия строится не на пустом месте, а на другой линии, свойство линии OuterLineWidth должно быть обнулено? Иначе линия не построится? Каким боком тут вообще OuterLineWidth, если я строю линию InnerLineWidth? Я понимаю, что своя логика здесь должна быть. Но про это нигде не сказано.

Massaraksh7

Я уже не говорю про другие многочисленные примеры. Например, при записи вещественного значения в ячейку его надо указывать с разделителем по умолчанию. А при передаче массивом - только с "точкой" в качестве разделителя. Я не нашёл, где это описано. Через все эти грабли пришлось проламываться.

mikekaganski

Почему Вы решили, что OuterLineWidth надо обнулять? Если Вы не будете раскомментировать в Вашем коде строку с OuterLineWidth, а только раскомментируете IsBottomLineValid, то всё будет работать.
С уважением,
Михаил Каганский

mikekaganski

Цитата: Massaraksh7 от 13 октября 2024, 16:32Я уже не говорю про другие многочисленные примеры. Например, при записи вещественного значения в ячейку его надо указывать с разделителем по умолчанию. А при передаче массивом - только с "точкой" в качестве разделителя.

Как говорится, "рукалицо". О чём речь? С чего это требуется? Без конкретного кода вообще ничего обсуждать нельзя.
С уважением,
Михаил Каганский