Ширина столбца при открытии csv

Автор Reweb, 16 марта 2023, 17:42

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

mikekaganski

Цитата: sokol92 от 17 марта 2023, 20:58Если Вы при сохранении шаблона укажете свойство "Установить шаблоном по умолчанию", то все новые документы будут создаваться на основе этого шаблона.

С учётом контекста вопроса, я полагаю, это не подойдёт - потому что речь о настройке CSV, с которыми идёт интенсивная работа.

Можно было бы подумать о присоединении CSV как листа ODS, и тогда уже настроить всё как надо. Но это будет удобно только для CSV, лежащего на одном месте и с одним именем.
С уважением,
Михаил Каганский

eeigor

Владимир, попробуйте выделить весь лист и задать автоперенос слов.
Потом выберите любую ячейку за пределами используемого диапазона (UsedArea), Вы увидите, что установленный флажок сброшен.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

С уважением,
Михаил Каганский

kompilainenn

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

sokol92

Цитата: mikekaganski от 17 марта 2023, 21:07Можно было бы подумать о присоединении CSV как листа ODS, и тогда уже настроить всё как надо. Но это будет удобно только для CSV, лежащего на одном месте и с одним именем.
Альтернатива - не открывем csv напрямую, а импортируем данные через Меню Лист / Внешние связи. При необходимости обновляем по расписанию или вручную через Меню Правка / Ссылка на внешние файлы.
Владимир.

sokol92

Цитата: eeigor от 17 марта 2023, 21:08Владимир, попробуйте выделить весь лист и задать автоперенос слов.
Я предложил поменять свойства стиля ячеек "Базовый" ("Default").
Владимир.

Reweb

Цитата: eeigor от 17 марта 2023, 14:24В код выше (ответ #6) внесены изменения – добавлены комментарий к процедуре, исправлена ошибка (удалена константа COLUMNWIDTH_DEFAULT) и вставлен требуемый код:
Огромное спасибо за макросы, работают. Причём самый первый до того как Вы его исправили лучше, чем после исправления :)
Правда как-то не стабильно. Раз отработает нормально, второй раз как-то частично.. То требует выделения, то ещё что-то..
И периодически при вызове макроса начало появлятся сообщение о необходимость установки java. Хотя до сегодня этого сообщения я не видел и без явы всё работает.
Но это ладно.
Я пытался добавить первым шагом автофильтр, но у меня не получилось - разные ошибки выходят.
Вот один из вариантов начала макроса:
Sub SetColumnWidthsAsInSelRow()
Call Autofilter
Call SetAppropColumnWidths(bAsInSelRow:=True)
End Sub

sub Autofilter
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(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())


end sub
Sub SetAppropColumnWidths(Optional bAsInSelRow As Boolean)

'''ну и далее выше данный код..

Мб засада в том, что на разных языках написано...

Как правильно прописать вызов автофильтра перед выполнением остальной части?

Reweb

Цитата: sokol92 от 17 марта 2023, 20:58Можете создать новый документ Calc, изменить свойства стиля ячеек "Базовый" (Меню Стили / Управление стилями) по своему усмотрению и сохранить этот документ как шаблон (Меню Файл / Шаблоны / Сохранить как шаблон). Если Вы при сохранении шаблона укажете свойство "Установить шаблоном по умолчанию", то все новые документы будут создаваться на основе этого шаблона.
Спасибо, попробовал. Но к сож. это работает только для новых листов. При открытии csv увы, этот шаблон не подхватывается :(

eeigor

#23
Цитата: Reweb от 17 марта 2023, 23:38Причём самый первый до того как Вы его исправили лучше, чем после исправления :)
Правда как-то не стабильно. Раз отработает нормально, второй раз как-то частично
Там, вроде, была ошибка: если ширина превышала 5 см, то устанавливалась ширина по умолчанию, а надо было оставить 5 см. – Исправлено.
Другие ошибки, если есть, надо локализовать и описать подробнее.
Также внимательно прочтите ответ #13 в конце, где говорится о независимом использовании процедуры UnoSetOptimalColumnWidth.
Кроме того, ведь было добавлено вертикальное выравнивание по верхнему краю и автоперенос строк с подгонкой высоты строки.

Работает как переключатель. Необходимо выбрать ячейку в диапазоне данных. По-другому: нажать Shift+Ctrl+L. Пользуйтесь горячими клавишами.
Sub UnoToggleAutoFilter()
''' Toggle AutoFilter for the selected range.

Dim document As Object, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())
End Sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: Reweb от 17 марта 2023, 23:38И периодически при вызове макроса начало появлятся сообщение о необходимость установки java.
Java не требуется. Но у меня вот так (чтобы не спрашивала):
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Reweb

Цитата: eeigor от 18 марта 2023, 00:52Java не требуется.
Да я понимаю. Тем не менее не всегда, но иногда появлялось.

Цитата: eeigor от 18 марта 2023, 00:36Другие ошибки, если есть, надо локализовать и описать подробнее.
Проблема в том, что они нестабильные. То воспроизводятся, то нет.
Попробуйте после открытия файла запустить макрос, потом откатить все действия и снова запустить макрос.
(и кстати, после отката всех действий вид листа уже другой, нежели при первом открытии. Как минимум высота строк не возвращается в первоначальное состояние)

Да, может это важно - у меня может быть не одна сотня столбцов и несколько тыщ (мб до десятка тыщ) строк.

Цитата: eeigor от 18 марта 2023, 00:36Кроме того, ведь было добавлено вертикальное выравнивание по верхнему краю и автоперенос строк с подгонкой высоты строки.
Вот как раз подгонка по высоте мне не нужна. Наоборот нужно одинаковая высота строк (высотой в один видимый символ).

Цитата: eeigor от 18 марта 2023, 00:36Необходимо выбрать ячейку в диапазоне данных.
И выделение - лишние телодвижения. Нужно чтобы применялось ко всей строке с активной ячейкой. Либо просто первая строка. (грубо говоря я хочу облегчить работу чтобы было так: открыл csv-файл из файл-менеджера - нажал кнопку на панели/хоткей и получил нужное форматирование строк/столбцов/ячеек)


Но я пока не сильно разобрался с Вашими макросами.. Просто времени не было (всё пытался автофильтр добавить и другие хотелки реализовать). Надеюсь сегодня поразбираюсь. Ещё раз большое спасибо за помощь.

eeigor

#26
Цитата: Reweb от 18 марта 2023, 12:51Вот как раз подгонка по высоте мне не нужна. Наоборот нужно одинаковая высота строк (высотой в один видимый символ).
За это отвечают строки:
   oCursor.IsTextWrapped = True
   oCursor.Rows.OptimalHeight = True
Автоперенос слов должен быть выключен.

Добавьте:
   Const COLUMNWIDTH_MAX = 5000, OPTIMALHEIGHT = False
Измените:
   If OPTIMALHEIGHT Then
      oCursor.IsTextWrapped = True
      oCursor.Rows.OptimalHeight = True
   End If

Цитата: Reweb от 18 марта 2023, 12:51Как минимум высота строк не возвращается в первоначальное состояние)
Чтобы подогнать высоту строк, надо выполнить код для диапазона (зд. его роль играет курсор) при выключенном автопереносе слов:
   oCursor.IsTextWrapped = False
   oCursor.Rows.OptimalHeight = True

Автофильтр
Может так (передайте в процедуру DisplayAutoFilter, к примеру, ячейку A1 как объект):
Sub DisplayAutoFilter(oRange As Object)
''' Apply an empty filter to suppress the message about whether to consider
''' the first row as column headers, and call the UnoToggleAutoFilter to display
''' Autofilter drop-down arrows in the range fields.
''' Calls: UnoToggleAutoFilter

ThisComponent.CurrentController.select(oRange)

Dim oFilterDsc As Object  'filter descriptor
oFilterDsc = oRange.createFilterDescriptor(True)  'bEmpty:=True
' Set the Standard filter "Range contains column labels" flag to True.
oFilterDsc.ContainsHeader = True  'see "Standard Filter - Options"
oRange.filter(oFilterDsc)
Call UnoToggleAutoFilter
End Sub

Sub UnoToggleAutoFilter()
''' Toggle AutoFilter for the selected range.
''' Called by: DisplayAutofilter

Dim document As Object, dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())
End Sub
Прим. В процедуре DisplayAutoFilter применяется пустой фильтр с тем, чтобы только задать свойство ContainsHeader и избежать потом вывода запроса о том, содержит ли первая строка диапазона заголовки столбцов.
Но UnoToggleAutoFilter работает как переключатель*, и нет простого способа определить, отображается ли Автофильтр в данный момент, разве что обратиться к анонимному (unnamed) диапазону, но это уже "дебри":
    ThisComponent.getPropertyValue("UnnamedDatabaseRanges").getByTable(nSheet).AutoFilter
Поэтому использование горячих клавиш (Shift+Ctrl+L) по-прежнему приветствуется.

* Вы же встроили вызов метода UnoToggleAutoFilter в один из моих макросов. Кнопки Автофильтра то отобразятся, то исчезнут: так не пойдет. Его надо вызывать как-то отдельно и один раз, не из макросов установки ширины столбцов диапазона.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community