当前位置: 首页 > 面试题库 >

如何在OpenOffice.Org Calc的单元格公式中调用Python宏?

芮建茗
2023-03-14
问题内容

为了扩展OpenOffice的功能,我在用户脚本目录(在本例中为〜/
Library / Application Support / OpenOffice.org / 3 / user / Scripts / python
/)的文件中定义了一些Python宏。这些宏在Python宏组织器中可见。但是,在单元格公式中使用这些功能会导致“ #NAME?”
(OO.org错误525)。

假设我定义了以下函数:

def pytype(val):
    return str(type(val))

如何调用pytype单元格公式(例如=PYTYPE("string"))?

背景

我正在从Authorize.net导入一些数据到MySQL数据库中进行分析。MySQL无法将Authorize.net使用的日期和时间格式解析为DATETIMEorTIMESTAMP字段,因此我试图将数据整理为MySQL可以在导入之前处理的格式。OpenOffice也不将数据识别为日期和时间,据我所知,OO.Org没有通用的日期解析功能。因此,我正在扩展OO.org的功能。

对于更大的问题,还有其他方法。例如,我还可以尝试使用其他列来修复MySQL导入后的数据。实际上,这是我第一次做。但是,表中现在有需要解决的数据。因此,由于将来还有其他任务,我希望通过在公式中使用宏来完成,目前,我最感兴趣的是在公式中调用Python宏。


问题答案:

在旧的OO.org论坛上,(超级)用户Villeroy发布了有关如何从OO.org
Basic
调用Python函数的说明,然后可将其用于公式中。关键是将com.sun.star.script.provider.MasterScriptProviderFactory服务用作桥梁。这是他的解决方案的改编版,可概括为在任意模块中调用任意函数:

REM Keep a global reference to the ScriptProvider, since this stuff may be called many times: 
Global g_MasterScriptProvider as Object
REM Specify location of Python script, providing cell functions: 
Const URL_Main as String = "vnd.sun.star.script:" 
Const URL_Args as String = "?language=Python&location=user"

Function invokePyFunc(file AS String, func As String, args As Array, outIdxs As Array, outArgs As Array)
   sURL = URL_Main & file & ".py$" & func & URL_Args
   oMSP = getMasterScriptProvider()
   On Local Error GoTo ErrorHandler
      oScript = oMSP.getScript(sURL)
      invokePyFunc = oScript.invoke(args, outIdxs, outArgs)
      Exit Function
   ErrorHandler:
      Dim msg As String, toFix As String
      msg = Error$
      toFix = ""
      If 1 = Err AND InStr(Error$, "an error occurred during file opening") Then
         msg = "Couldn' open the script file."
         toFix = "Make sure the 'python' folder exists in the user's Scripts folder, and that the former contains " & file & ".py."
      End If
      MsgBox msg & chr(13) & toFix, 16, "Error " & Err & " calling " & func
end Function

Function getMasterScriptProvider() 
   if isNull(g_MasterScriptProvider) then 
      oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory") 
      g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("") 
   endif 
   getMasterScriptProvider = g_MasterScriptProvider
End Function

然后可以使用它来创建可在公式中调用的OO.org Basic函数。使用示例pytype

Const libfile as String = "util"    REM functions live in util.py

Function pytype(value)
    pytype = invokePyFunc(libfile, "pytype", Array(value), Array(), Array())
End Function

另一个可能的实现是创建一个Python加载项。但是,这是一个繁重的选择,因为它需要安装OpenOffice
SDK,并且对于这种方法是适用于免费功能还是仅适用于类,这对我来说并不明显。



 类似资料:
  • 我试图从excel文件中读取所有数据,其中也有一些公式单元格,但我不知道哪个单元格是公式单元格。如何读取单元格中的所有值,而不考虑单元格的类型。 我的代码看起来像这样 我得到的公式单元格值为0

  • 但这无济于事。有什么想法吗?

  • 我的代码设置了很多单元格值。最后,在生成excel文件之前,需要评估每个单元格中的公式。对于大多数床单来说,一切都很顺利。 但是,有一个单元格正在引发异常。该单元格正在计算其后面的一系列单元格和其他工作表中的参考单元格的平均值。我猜当第一个单元格试图计算平均值时,后面的单元格尚未计算。 这是那个单元格上的公式 我怀疑是因为单元格int限制了其他工作表中的引用单元格。例如,D2具有以下公式。 所以我

  • 问题内容: 我必须将 算法从Excel工作表移植到python代码, 但必须对 Excel文件中的算法 进行 反向工程 。 Excel工作表非常复杂,它包含许多单元格,在这些单元格中有引用其他单元格的公式(也可以包含公式或常数)。 我的想法是使用python脚本分析工作表,以构建一种单元格之间的依存关系表,即: A1取决于B4,C5,E7公式:“ = sqrt(B4)+ C5 * E7” A2取决

  • 我正在使用apache POI更改excel表中的单元格。更改值后,与已更改的单元格对应的公式的单元格不会更新。 当我进入excel并单击带有公式的单元格,然后在函数栏中单击时,公式会更新。 A1仍然等于3,直到我点击那个单元格。 刷新工作簿或工作表也不起作用。这是excel或POI的问题吗?有人能想出一个变通办法吗?

  • 注意:对于.xls类型的excel文件,我使用的是ExcelLibrary.dll库,可以使用下面的代码轻松获取单元格的数据类型 但在Spreadsheetlight中没有类似的方法。

  • 答案是接下来: 1) 谷歌表单单元格“A11”中有公式,例如“=F11 C11”; 2)我在https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate或https://developers.google.com/sheets/api/reference/rest/v4/spre