[Решено] Крашится LO при включении автофильтра при "скрытом" создании файла

Автор Sirius34, 13 сентября 2024, 15:05

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

Sirius34

Всем доброго времени суток!

Импортирую макросом одну таблицу во внешний файл.
Хотел сделать всё неявно для пользователя, поэтому использовал параметр Hidden при создании нового документа.
По непонятной мне причине при экспортировании листа не сохраняются настройки автофильтра (то, что он вообще есть) и закрепления первой строки таблицы.
Поэтому перед закрытием вновь созданного файла добавил блок включения автофильтра.
К сожалению, блок с включением автофильтра крашит LO, калк просто закрывается с соответствующим сообщением.
Блок закрепления отрабатывает без ошибок.
Поэкспериментировал. Крашится только при режиме Hidden = True.
В режиме False всё работает без проблем...

LO 24.2.6.2

sokol92

Здравствуйте!
Предлагаю исследовать вопросы по одному.
Цитата: Sirius34 от 13 сентября 2024, 15:05По непонятной мне причине при экспортировании листа не сохраняются настройки автофильтра (то, что он вообще есть) и закрепления первой строки таблицы.
С помощью каких конструкций Вы осуществляете экспорт?
Цитата: Sirius34 от 13 сентября 2024, 15:05К сожалению, блок с включением автофильтра крашит LO, калк просто закрывается с соответствующим сообщением.
С помощью каких конструкций Вы выставляете автофильтр?

Цитата: Sirius34 от 13 сентября 2024, 15:05Поэкспериментировал. Крашится только при режиме Hidden = True.
Не все конструкции корректно работают в случае, когда документ скрыт.
Я в подобных случаях информирую пользователя о продолжающейся операции и прошу подождать завершения.



Владимир.

Sirius34

Цитата: sokol92 от 13 сентября 2024, 15:20С помощью каких конструкций Вы осуществляете экспорт?
oDoc2.Sheets.importSheet(oDoc, oSourceShtName, oDoc2.Sheets.Count)
ЦитироватьС помощью каких конструкций Вы выставляете автофильтр?
    Dim ArgsDispatch1(0) as new com.sun.star.beans.PropertyValue
    ArgsDispatch1(0).Name = "ToPoint"
    ArgsDispatch1(0).Value = "$A$1"
    dispatcher.executeDispatch(CCF2, ".uno:GoToCell", "", 0, ArgsDispatch1())
    dispatcher.executeDispatch(CCF2, ".uno:DataFilterAutoFilter", "", 0, Array())

ЦитироватьНе все конструкции корректно работают в случае, когда документ скрыт.
Я в подобных случаях информирую пользователя о продолжающейся операции и прошу подождать завершения.
Это понятно. Просто (в идеале) хочется, чтобы пользователь видел минимум технологических операций, вызывающих "мелькание" окон на экране...

sokol92

Об автофильтре.
Поскольку Вы (скорее всего) знаете диапазон, для которого устанавливается автофильтр, то лучше всего автофильтр установить с помощью нового диапазона базы данных.
Попробуйте такой путь, не прибегая к помощи Диспетчера.
' Устанавливает автофильтр для прямоугольного диапазона ячеек oRange.
' Создается новый диапазон базы данных c именем DBName. Если DBName не задано, то подбирается автоматически.
Sub SetAutoFilter(ByVal oRange As Object, Optional ByVal DBName As String)
  Dim oDoc As Object, oDBRanges as Object, oDBRange as  Object, newName As String, i As Long
  oDoc=oRange.Spreadsheet.DrawPage.Forms.Parent
  oDBRanges=oDoc.DatabaseRanges
 
  If IsMissing(DBName) Then DBName="RangeFilter" & oRange.Spreadsheet.RangeAddress.Sheet
  Do While True   ' ищем свободное имя
    newName= DBName & IIf(i=0, "", "_" & i)
    If Not oDBRanges.hasByName(newName) Then
      Exit Do
    Else
      i=i+1
      If i>=100 Then Exit Sub  ' не нашли!!
    End If
  Loop
 
  oDBRanges.addNewByName newName, oRange.RangeAddress
  oDBRange=oDBRanges.getByName(newName)
  oDBRange.ContainsHeader=True
  oDBRange.AutoFilter=True
End Sub

Sub TestSetAutoFilter
  SetAutoFilter ThisComponent.CurrentSelection

End Sub

Сообщите об успехах!
Владимир.

Sirius34

Цитата: sokol92 от 13 сентября 2024, 20:24Попробуйте такой путь, не прибегая к помощи Диспетчера
Добрый вечер!

Спасибо большое, всё получилось, работает и в скрытом, и в обычном режиме.

Sirius34

Как выяснилось, в первом сообщении я был не прав :(
Закрепление первой строки в другом (не основном) документе вообще не срабатывает.
Тот же код, но запущенный просто в ThisComponent работает отлично...
Я уже ничего не понимаю

sokol92

Это ошибка из разряда "замылился глаз".  :)

Вы сначала сохраняете файл, а затем фиксируете строку и закрываете файл. Сохраняйте файл непосредственно перед закрытием.

Для фиксации строк и столбцов помощь Диспетчера так же, как и в случае с автофильтром, не нужна. У контроллера документа есть метод freezeAtPosition.
Владимир.

Sirius34


Sirius34

Цитата: sokol92 от 13 сентября 2024, 15:20Не все конструкции корректно работают в случае, когда документ скрыт
Как мне кажется при экспортировании листа, пусть в нескрытом режиме, настройки автофильтра и закрепления строк должны сохраняться.
Локально ведь лист копируется нормально...

mikekaganski

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

Sirius34

Цитата: mikekaganski от 15 сентября 2024, 21:24Другое дело - есть ли баги об этом
Кстати, о багах.
По идее, краш оболочки при выполнении обычной процедуры - не есть хорошо ведь?
Автоматический отчёт о сбое, конечно, куда-то там улетел. Но в теории, надо, наверное, этот баг описать?

mikekaganski

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

Sirius34

Цитата: mikekaganski от 16 сентября 2024, 09:47Да. Любой краш - всегда баг. (А что значит "оболочка"?)
Ну, может не так выразился :)
Во время работы макроса Calc вылетает с сообщением об ошибке.
При этом в процессах soffice.bin и soffice.exe остаются висеть, типа работают.
При следующем открытии Calc появляется стандартное сообщение о сбое с предложением отправить отчёт и загрузиться в безопасном режиме. Ну и потом обычный вопрос про восстановление файла.

Sirius34

Похоже, что корень проблемы именно в работе автофильтра.
Если в нормальном режиме он вроде как срабатывает на внешний файл, но не даёт никакого эффекта, то в скрытом режиме сразу рушит Calc.
Я, если честно, не знаю - как такое поведение описать в виде бага.
Возможно, что это частный случай конкретно моего "рукожопного" алгоритма, тогда смысла отправлять это в доработку, наверное, не будет...
Тем более, что рабочий вариант автофильтра уважаемый sokol92 уже привёл выше в рамках данного топика.

На всякий случай прикладываю файл. Может, специалисты посмотрят при наличии оказии и желания :)
Специально сделал два варианта скрипта на разные кнопки, чтобы видно было разницу.

mikekaganski

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