Как автозаполнить редактор формул OpenOffice Math в OOo Calc?

Я использую формулы электронных таблиц OpenOffice Calc с псевдослучайными числами для создания массивов арифметических задач, которые я могу легко обновить для создания новых рабочих листов (я учитель)

Проблемы выводятся в виде разметки формул в строковой форме. Формулы OOo Math используют эти строковые команды, введенные в редактор, для отображения хорошо отформатированных математических выражений.

Я могу сделать следующий шаг вручную:

1) go to source cell and copy string mark-up to clipboard  
2) select target cell and clear existing contents and objects  
3) create new Math object anchored to target cell  
4) open Math editor window and paste in mark-up string  
5) exit Math editor window and return cursor to source cell

Результат: красивое математическое выражение заданной арифметической задачи.

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

Я нашел здесь код: Содержимое ячейки внутри формулы, которое достигает этого для фиксированной пары ячеек, но несмотря на все мои усилия, мне пришлось признать поражение - обобщение этого кода просто вне моей компетенции!

Абсолютным идеалом была бы функция макроса, которую я мог бы вызвать как функцию электронной таблицы; с входными аргументами (sourceCell, targetCell, listenerON / OFF), которые могут запускать вышеуказанный алгоритм и при необходимости динамически обновляться.

Кто-нибудь может мне помочь? Подобное решение или любой другой обходной путь были бы чрезвычайно полезны.


ОБНОВЛЕНИЕ 2016/10/27

Спасибо, Джим К., это сработало, но использование диспетчера сопряжено с целым рядом трудностей, которых я не предвидел. Я только что нашел Чарли Сообщение Янга на форуме OpenOffice, в котором используется API. Я включил свою адаптацию его кода ниже.

Может ли кто-нибудь помочь мне интегрировать его в функцию таким же образом, как я описал? Я не знаю, как решить размещение объекта Math в целевой ячейке.

Код API великолепен, поскольку он будет создавать новый объект Math при каждом обновлении кода. Однако существующие необходимо удалить.

Я думаю, что ограничение, связанное с невозможностью удалить существующие объекты из функции, сохранится. Будет ли это так, даже если это делается подпрограммой, вызываемой функцией?

function InsertFormula(paraFromCell, paraToCell)
   Dim oDoc As Object
   Dim oSheet As Object
   Dim oShape As Object

   oDoc = ThisComponent
   oSheet = oDoc.Sheets(0)

   oShape = oDoc.createInstance("com.sun.star.drawing.OLE2Shape")
   oShape.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997"

   oSheet.Drawpage.Add(oShape)
   oShape.Model.Formula = paraFromCell

   oShape.setSize(oShape.OriginalSize)
end function

СЛЕДУЮЩЕЕ ОБНОВЛЕНИЕ

Я довольно быстро умудряюсь решать собственные проблемы ...

Я решил использовать подпрограмму, а не функцию, поэтому я могу получить доступ к листу для удаления существующих объектов. Код прилагается - исходные ячейки находятся в столбце C, а целевые ячейки - в совпадающих строках столбца A. Пока я могу отправлять объекты только в $ A $ 1.

Как привязать каждый новый объект к определенной ячейке?

REM  *****  BASIC  *****

Sub InsertThisFormula

  Dim oDoc As Object
  Dim oSheet As Object
  Dim oShape As Object
  Dim sourceCell As Object
  Dim targetCell As Object

  oDoc = ThisComponent
  oSheet = oDoc.Sheets(1)

  Dim n As Integer
  n = 1 'number of rows of formulas

  for i = 0 To n-1
     rem loop through cells
     sourceCell = oSheet.getCellByPosition(2, i)
     targetCell = oSheet.getCellByPosition(0, i)

     rem clear target cell object/s
     targetCell.ClearContents(128)

     oShape = oDoc.createInstance("com.sun.star.drawing.OLE2Shape")
     oShape.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997"

     oSheet.Drawpage.Add(oShape)
     oShape.Model.Formula = sourceCell.string

     oShape.setSize(oShape.OriginalSize)

  Next i

End Sub

person rsmooo    schedule 26.10.2016    source источник
comment
Удалите Solved из заголовка и опубликуйте найденное вами решение как правильный ответ.   -  person Jongware    schedule 29.10.2016


Ответы (2)


Начиная с примера Mifeet, добавьте это в My Macros:

rem ----------------------------------------------------------------------
rem Creates a math formula from text
Function InsertFormulaFromCell(paramCellFrom, paramCellTo)
    dim document as object
    dim dispatcher as object
    document = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

    rem go to cell containing markup and copy it
    dim fromCellArgs(0) as new com.sun.star.beans.PropertyValue
    fromCellArgs(0).Name = "ToPoint"
    fromCellArgs(0).Value = paramCellFrom
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, fromCellArgs())
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

    rem go to cell where I want the formula displayed
    dim toCellArgs(0) as new com.sun.star.beans.PropertyValue
    toCellArgs(0).Name = "ToPoint"
    toCellArgs(0).Value = paramCellTo
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, toCellArgs())

    rem open Star.Math
    oDesk = createUnoService ("com.sun.star.frame.Desktop")
    dispatcher.executeDispatch(document, ".uno:InsertObjectStarMath", "", 0, Array())
    document = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

    rem paste clipboard using Array() as place-holder for variable name
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

    rem exit Star.Math
    dispatcher.executeDispatch( _
        document, ".uno:TerminateInplaceActivation", "", 0, Array())
    InsertFormulaFromCell = "Math Formula updated " & Now()
End Function

Чтобы запустить его, поместите эту формулу в ячейку C5:

=INSERTFORMULAFROMCELL("$C$3","$C$20")

Теперь, когда значения обновляются, создается другая формула.

Примечание. Мне не удалось заставить работать .uno:Delete код Mifeet, возможно, потому что функции не должны иметь доступ к другим ячейкам. Это может потребовать ручного удаления формул перед созданием новых.

person Jim K    schedule 26.10.2016
comment
Спасибо, Джим К.! Это действительно работает, но похоже, что при использовании диспетчера таким образом возникло множество проблем. Я только что наткнулся на это сообщение: forum.openoffice.org/en/forum/viewtopic.php?t=45282 Казалось бы, гораздо более элегантное решение. Пытаюсь получить от него ту же функциональность. Тем не менее, чтобы иметь возможность поместить формулу в целевую ячейку. - person rsmooo; 27.10.2016

(Опубликовано решение от имени OP).

Теперь это решено. После долгих поисков я нашел то, что мне было нужно! Действительно просто. В будущем можно будет изменить размер ячеек соответствующим образом. На данный момент счастлив. Спасибо Джиму К. и остальным участникам сообщества Stack Overflow!

Полный макрос ниже:

REM  *****  BASIC  *****

  Sub InsertThisFormula

  Dim oDoc As Object
  Dim oSheet As Object
  Dim oShape As Object
  Dim sourceCell As Object
  Dim targetCell As Object

  oDoc = ThisComponent
  oSheet = oDoc.Sheets(1)

  Dim n As Integer
  n = 6 'number of rows of formulas

  for i = 0 To n-1
     rem loop through cells
     sourceCell = oSheet.getCellByPosition(2, i)
     targetCell = oSheet.getCellByPosition(3, i)

     rem clear target cell object/s
     targetCell.ClearContents(128)

     oShape = oDoc.createInstance("com.sun.star.drawing.OLE2Shape")
     oShape.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997"

     oSheet.Drawpage.Add(oShape)
     oShape.Model.Formula = sourceCell.string

     oShape.setSize(oShape.OriginalSize)

     oShape.Anchor = targetCell
     oShape.MoveProtect = True

  Next i

End Sub
person Community    schedule 31.10.2016