Calc: ArrayFormulaLocal ?

Автор eeigor, 21 марта 2020, 13:51

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

rami

Цитата: mikekaganski от 11 апреля 2020, 12:47Или есть уже что-то готовое для этого?
В контексте обсуждения "как узнать используемые разделители" я готовых решений не знаю (кроме упомянутой библиотеки  Tools)

Если бы автор вопроса сформулировал его так, как мы постоянно просим: "есть массив диапазонов, нужно получить их адреса в виде простой строки вида "A1:A5; A9:A15; A20:A25", мне бы никогда не пришла мысль искать разделители в настройках, для решения такой задачи есть "уже (давно) что-то готовое" — сервис "com.sun.star.table.CellRangeAddressConversion", в этом случае не нужно знать ничего о разделителях. Но eeigor выбрал не самое оптимальное решение и завёл нас в интересные дебри разделителей.


В примере двойной щелчок по "чекбоксу" (ячейки в столбце A) устанавливает или снимает "птичку", а также обновляет диаграмму и подпись диапазонов под ней. (Кнопку под диаграммой убрал)

eeigor

#46
Цитата: rami от 14 апреля 2020, 12:59и завёл нас в интересные дебри разделителей
Сам того не ведая... (ибо новичок в LO), но сижу довольный... интересными дискуссиями.
rami, про метод CellRangeAddressConversion слышал, и ваш пример разберу обязательно.

Зд. много и других занимательных веток.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#47
Добрый день! Не знаю, представляет ли интерес следующий макрос, который выводит все имена функций, разделители, использующиеся в формулах в стандартном и локализованом виде. Еще может быть, на мой взгляд, полезна функция getMappings сервиса "com.sun.star.sheet.FormulaOpCodeMapper".

Sub ShowFormulaOpCodes
 Dim oFormula, DataArray, v1, v2, i as Long, arr2
 oFormula=CreateUnoService("com.sun.star.sheet.FormulaOpCodeMapper")
 
 v1=oFormula.getAvailableMappings(6, &H07fffffff)   ' FormulaLanguage: 6=API
 v2=oFormula.getAvailableMappings(3, &H07fffffff)   ' FormulaLanguage: 3=NATIVE
 
 Redim DataArray(Ubound(v1)+1)
 DataArray(0)=Array("Name", "LocalName", "OpCode")              ' Headers

 For i=0 To Ubound(v1)
   redim arr2(2)
   arr2(0)=v1(i).Name
   arr2(1)=v2(i).Name
   arr2(2)=v1(i).Token.OpCode
   DataArray(i+1)=arr2    
 Next i
 
 ShowDataArray DataArray
End Sub

' Show DataArray in new Calc document
Sub ShowDataArray(DataArray)
 Dim oDoc, oSheet, oRange
 oDoc = StarDesktop.loadComponentFromURL( "private:factory/scalc", "_blank", 0, Array() )
 oSheet = oDoc.getSheets().getByIndex(0)
 oRange=oSheet.getCellRangeByPosition(0,0,Ubound(DataArray(0)),Ubound(DataArray),0)
 oRange.SetDataArray DataArray
End Sub
Владимир.

rami

Цитата: sokol92 от 19 апреля 2020, 19:31представляет ли интерес следующий макрос, который выводит все имена функций, разделители, использующиеся в формулах в стандартном и локализованом виде
В принципе, можно использовать этот сервис для получения разделителей, но для решения рассмотренной в теме задачи это слишком велосипедно, а для чего ещё трудно представить.

Цитата: sokol92 от 19 апреля 2020, 19:31Еще может быть, на мой взгляд, полезна функция getMappings сервиса "com.sun.star.sheet.FormulaOpCodeMapper".
Можно узнать OpCode, что дальше?

mikekaganski

Цитата: sokol92 от 19 апреля 2020, 19:31
Не знаю, представляет ли интерес следующий макрос, который выводит все имена функций, разделители, использующиеся в формулах в стандартном и локализованом виде. Еще может быть, на мой взгляд, полезна функция getMappings сервиса "com.sun.star.sheet.FormulaOpCodeMapper".

Это, конечно, интересный сервис, но к сожалению, для разделителей списка он не слишком полезен - именно из-за того, что в каноническом представлении "имя" этого разделителя совпадает с именем разделителя столбцов в массиве. Поэтому нельзя просто определить, какая из ";", возвращённая getAvailableMappings, относится к чему (если только не предполагать, что разделитель списка идёт раньше разделителя столбцов массива, что, кмк, является деталью реализации и не гарантировано). Тем более не получится использовать getMappings с ";" - потому что неясно, для какой из них оно вернёт результат.
С уважением,
Михаил Каганский

sokol92

#50
Коллеги, спасибо за ответы!
У нас в практике MS Excel были задачи, для которых наличие подобного опубликованного сервиса позволило бы существенно упростить решение.
Владимир.

sokol92

Наткнулся на способ получения информации о локали без использования (нелюбимой мною) библиотеки Tools - сервис LocaleData. Для "быстрого старта":

Sub testLocale
  Dim oLocaleData, v1, v2,v3,v4,v5
  Dim aLocale as new com.sun.star.lang.Locale
  oLocaleData=createUnoService("com.sun.star.i18n.LocaleData")
  ' Запрашиваем информацию о локали по умолчанию. Если нужна иная локаль, то перед вызовом нужно заполнить структуру aLocale
  With oLocaleData
     v1=.getLocaleItem(aLocale)             ' разделители (числа, дата,  время, список, кавычки)
     v2=.getAllCalendars2(aLocale)          ' названия дней, месяцев (именительный и родительный падеж для ru), c какого дня начинается неделя, ...
     v3=.getAllCurrencies2(aLocale)         ' используемые валюты
     v4=.getAllFormats(aLocale)             ' числовые форматы (системные, для данной локали)
     v5=.getDateAcceptancePatterns(aLocale) ' шаблоны, используемые для интерпретации дат при вводе 
  End With
End Sub
Владимир.