[Решено] Writer: Слетает форматирование при вставке строки в таблицу

Автор Massaraksh7, 22 мая 2024, 21:43

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

Massaraksh7

Цитата: rami от 24 мая 2024, 17:08Проверьте поведение таблиц после нажатия на кнопку:
Excellent! Чем отличается вторая таблица?

rami

Цитата: Massaraksh7 от 24 мая 2024, 17:23Excellent! Чем отличается вторая таблица?
Вы лучше скажите, чем отличается первая таблица? Я как ни рыпался, не смог повторить ваш эффект.

Сначала я попробовал воспроизвести у себя с нуля, эффекта не было.
В вашем примере из багзилы, эффект появился. После вставки новой таблицы в ваш документ таблицы ведут себя по разному, у вашей есть эффект, у моей нет. Думаю, что проблема в самой таблице, а не в форматах или стилях.

Попробуйте переименовать папку пользователя, чтобы проверить на чистых настройках по умолчанию.

Massaraksh7

Цитата: rami от 24 мая 2024, 17:50Вы лучше скажите, чем отличается первая таблица?
Создаю новый документ (вот, прямо сейчас онлайн).
Таблица -> Вставить таблицу -> Стиль - базовый
Заполняю цифрами
Выделяю 1 строку, меняю стиль и цвет шрифта
Выделяю 2 строку, меняю стиль и цвет шрифта
Выделяю 3 строку, меняю стиль и цвет шрифта
Запускаю макрос в окошке отладки - всё слетает.

rami

Докопался до причины: проблема в стиле таблицы "Базовый" (или "Default Style")

Выполните макрос:Sub RemoveDefaultTableStyle
Dim oTextTables, table

oTextTables = ThisComponent.getTextTables()
For Each table In oTextTables
  table.TableTemplateName = ""
Next
End Sub
он уберёт проблемный стиль таблицы.

Если это решает вашу проблему, сообщите на багзилле, может это поможет.

Massaraksh7

Цитата: rami от 24 мая 2024, 18:39Докопался до причины: проблема в стиле таблицы "Базовый" (или "Default Style")
Отлично, всё получилось, спасибо!

rami

Цитата: Massaraksh7 от 24 мая 2024, 18:02Создаю новый документ (вот, прямо сейчас онлайн).
Таблица -> Вставить таблицу -> Стиль - базовый
При создании таблицы не выбирайте никакой стиль, по умолчанию должно быть "Нет", а если уж случился стиль, то макросом.

Кажется, все стили таблицы слетают если в окне "Автоформат" стоит галка "Орнамент" (я проверил несколько)

Если нужен стиль таблицы - создайте свой, у меня работает без проблем.

В общем, я думаю, что это не баг, а так должно быть.

Massaraksh7

Цитата: rami от 24 мая 2024, 19:43В общем, я думаю, что это не баг, а так должно быть.
То есть, такой оригинальный запрет на изменение стандартных стилей.  :D

rami

Цитата: Massaraksh7 от 24 мая 2024, 20:03То есть, такой оригинальный запрет на изменение стандартных стилей.  :D
Можно изменить любой стиль. У первой таблицы изменённый базовый стиль, вторая без стиля. Смотрите, какое поведение лучше (после заполнения вставленных строк).

Massaraksh7

Ну, а теперь, собственно, ради чего это всё затевалось.
Sub Main4
ParaEnum = ThisComponent.Text.createEnumeration
While ParaEnum.hasMoreElements()
  Para = ParaEnum.nextElement()
  if Para.supportsService("com.sun.star.text.TextTable") Then
      Rows=Para.getRows()                           '--Строки
      Rows.insertByIndex(1,1)                       '--Вставка строки
      Controller = ThisComponent.CurrentController    
      SourceRng = Para.getCellRangeByName("A3:B3")  '--Исходный range
      DestRng = Para.getCellByPosition(0, 1)        '--Результирующий Range
      Controller.select(SourceRng)                  '--Выделяем
      ToCopy = Controller.getTransferable()         '--Копируем
      Controller.select(DestRng)                    '--Выделяем
      Controller.insertTransferable(ToCopy)         '--Вставляем
  end if
Wend
end sub

Massaraksh7

Ещё здесь же спрошу: как можно узнать число столбцов в конкретной строке таблицы? Можно, конечно, перебрать все ячейки по адресам, но, может, есть какой-то штатный способ?

sokol92

Цитата: Massaraksh7 от 25 мая 2024, 13:36как можно узнать число столбцов в конкретной строке таблицы?
Там черт голову сломит.  :)
Это обсуждается в книге Питоньяка OOME_4_1.odt. раздел "Simple and complex tables".
На мой взгляд, перебор ячеек (getCellNames) - правильный путь.
Владимир.

Massaraksh7

Цитата: sokol92 от 25 мая 2024, 14:07На мой взгляд, перебор ячеек - правильный путь.
Да!
Sub Main
ParaEnum = ThisComponent.Text.createEnumeration
While ParaEnum.hasMoreElements()
  Para = ParaEnum.nextElement()
  if Para.supportsService("com.sun.star.text.Paragraph") Then 
     Para.String = mes 
     exit sub   
  end if   
  if Para.supportsService("com.sun.star.text.TextTable") Then
     count = UBound(Para.cellNames)
     rcnt = Para.getRows().getCount()
     mes=""
     for row = 1 to rcnt
        cnt=0
        for i=0 to count
            s = Para.cellNames(i)
            r = CInt(Mid(s,2,Len(s)-1))
            if row=r then cnt = cnt+1
        next i   
     mes = mes & "Row " & row & ": " & cnt & " columns" & Chr(10)
     next row
  end if
wend
End Sub

sokol92

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

А если в примере пообъединять и по вертикали, то уже трудно будет что-то понять.  :)

Кроме того, следует иметь в виду 52-ричную систему счисления при присвоении имен ячейкам текстовой таблицы.  ;D
Владимир.

Massaraksh7

Цитата: sokol92 от 25 мая 2024, 15:57Вы можете вместе с вложенным файлом прикладывать и текст макроса - это облегчит путь для поиска информации будущим читателям темы.
Сделано.
Цитата: sokol92 от 25 мая 2024, 15:57А если в примере пообъединять и по вертикали, то уже трудно будет что-то понять.
Код без претензии на универсальность. В моих задачах интересуют только те строки в таблице, которые заведомо не будет иметь объединений. А так - да, для установления детальной структуры таблицы нужен другой алгоритм.
Цитата: sokol92 от 25 мая 2024, 15:57Кроме того, следует иметь в виду 52-ричную систему счисления при присвоении имен ячейкам текстовой таблицы.
Слабо представляю себе таблицы Writer, которые имеют больше даже 20 колонок.


sokol92

Цитата: Massaraksh7 от 25 мая 2024, 16:36Слабо представляю себе таблицы Writer, которые имеют больше даже 20 колонок.
Когда-то специально генерировал такие таблицы и проверял.
Владимир.