如何在 OOo Calc 中自动填充 OpenOffice Math 公式编辑器?

Posted

技术标签:

【中文标题】如何在 OOo Calc 中自动填充 OpenOffice Math 公式编辑器?【英文标题】:How to autofill OpenOffice Math formula editor in OOo Calc? 【发布时间】:2016-10-26 10:32:00 【问题描述】:

我正在使用带有伪随机数的 OpenOffice Calc 电子表格公式来生成算术问题数组,我可以轻松地更新这些问题以创建新的工作表(我是一名教师)

问题以字符串形式作为公式标记输出。 OOo 数学公式使用输入到编辑器中的这些字符串命令来显示格式良好的数学表达式。

我可以手动执行下一步:

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

结果:给定算术问题的一个很好的数学表达式。

我需要能够对各种工作表上的整列源单元格执行此操作。 ...甚至更好,然后添加一个侦听器以在源更新时动态更新。

我在这里找到了代码:Cell content inside formula,它为一对固定的细胞实现了这一点,但尽管我尽了最大的努力,我还是不得不承认失败——推广这段代码简直超出了我的专业范围!

绝对理想是一个宏函数,我可以像电子表格函数一样调用它;带有可以运行上述算法并在需要时动态更新的输入参数(sourceCell、targetCell、listenerON/OFF)。

有人可以帮我吗?像这样的解决方案或任何类型的解决方法都会非常有帮助。


2016 年 10 月 27 日更新

谢谢 Jim K,这确实奏效了,但是使用调度程序会带来很多我没有预见到的困难。 我刚刚在使用 API 的 OpenOffice 论坛中找到了Charlie Young's post。我在下面包含了我对他的代码的改编。

谁能帮助我以与我描述的类似的方式将它集成到一个函数中?我不知道如何解决将 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

下一次更新

我现在已经设法很快解决了我自己的问题......

我决定使用 sub 而不是函数,因此我可以访问工作表以删除现有对象。附加代码 - 源单元格在 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

【问题讨论】:

请从您的标题中删除Solved,并将您找到的解决方案作为正确答案发布。 【参考方案1】:

从 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")

现在,当值更新时,它会创建另一个公式。

注意:我无法让 Mifeet 代码的 .uno:Delete 部分工作,可能是因为函数不应该访问其他单元格。这可能需要在创建新公式之前手动删除公式。

【讨论】:

谢谢吉姆 K!这确实有效,但是以这种方式使用调度程序似乎引入了很多问题。我刚刚遇到this 帖子:forum.openoffice.org/en/forum/viewtopic.php?t=45282 看似更优雅的解决方案。试图从中获得相同的功能。还不能将公式放在目标单元格中​​。【参考方案2】:

(代表 OP 发布解决方案).

现在已经解决了。经过大量搜索,我找到了我需要的东西!真的很简单。未来的改进可能是适当调整单元格的大小。暂时开心。感谢 Jim K 和 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

【讨论】:

以上是关于如何在 OOo Calc 中自动填充 OpenOffice Math 公式编辑器?的主要内容,如果未能解决你的问题,请参考以下文章

打开 Office org Calc(电子表格):64k 行的限制?

如何根据公式自动选择 OpenOffice Calc 单元格?

css CSS Calc使图像/元素填充父级填充以填充屏幕

OpenOffice Calc 自动化如何更改散点图的图表标签

自动从 Open Office Calc 发送电子邮件

如何在 LibreOffice Calc 中使用 PyUNO 更改单元格边框的 LineWidth?