LibreOffice Calc 中的脚本

Posted

技术标签:

【中文标题】LibreOffice Calc 中的脚本【英文标题】:Script in LibreOffice Calc 【发布时间】:2014-07-01 16:19:16 【问题描述】:

使用 LibreOffice Writer,我可以在文档中输入脚本(插入->脚本)。这些在.odt 文件的content.xml 中显示为<text:script script:language ="...">...</text:script>。当使用 jodreports jar 文件时,我可以让这些脚本按照http://jodreports.sourceforge.net/?q=node/25 中的描述工作。

现在我想对其他 LibreOffice 文档类型执行相同的操作,但是在 Calc 或 Impress 中没有插入->脚本的选项。我唯一看到的是宏,但它们存储在单独的 xml 文件中,而不是content.xml。如果我能在content.xml 文件中获得正确的标签来输入我的脚本,我相信 jodreports 会完成这项工作......

有什么想法吗?

【问题讨论】:

【参考方案1】:

这可以通过更改 jodreports 代码来解决。这不会在.odt 文件中添加请求的<text:script> 标记,因此严格来说它可能不是对特定问题的回答,但它会解决让jodreports 与LibreOffice Calc 文件配合使用的潜在问题。

更改 - 使用 jodreports 2.4.0 代码 - 在 net.sf.jooreports.templates.xmlfilters 包中,在文件 ScriptTagFilter.java 中。在函数doFilter中,我已经替换了

Nodes scriptNodes = document.query("//text:script[translate(@script:language, 'CIJOPRST', 'cijoprst')='jooscript']", XPATH_CONTEXT);

    //WRITER document (odt)
    Nodes odtScriptNodes = document.query("//text:script[translate(@script:language, 'CIJOPRST', 'cijoprst')='jooscript']", XPATH_CONTEXT);
    Nodes scriptNodes = odtScriptNodes;

    //CALC document (ods)
    Nodes odsPotentialScriptNodes = document.query("//table:table-cell", XPATH_CONTEXT);
    for(int nodeIndex = 0; nodeIndex < odsPotentialScriptNodes.size(); nodeIndex++)
        Element tableCellElement = (Element) odsPotentialScriptNodes.get(nodeIndex);
        Elements textElements = tableCellElement.getChildElements();
        if(textElements.size() > 0 && textElements.get(0).getValue().toLowerCase().startsWith("--!jooscript:"))
            String fullScript = textElements.get(0).getValue().substring("--!jooscript:".length());
            for(int elementIndex = 1; elementIndex < textElements.size(); elementIndex++)
                fullScript += System.getProperty("line.separator") + textElements.get(elementIndex).getValue();
            
            for(int elementIndex = textElements.size()-1; elementIndex > 0; elementIndex--)
                tableCellElement.removeChild(elementIndex);
            

            Element firstTextElement = (Element) tableCellElement.getChild(0);
            firstTextElement.removeChildren();
            firstTextElement.appendChild(fullScript);
            scriptNodes.append(firstTextElement);
        
    

这将允许在表格单元格中使用代码--!jooscript:。请注意,您将代码拆分为表格单元格中的多行,以获取诸如

之类的指令
@table:table-row
[#list items as item]
@/table:table-row
[/#list] 

因为在代码的后面,实际的脚本是逐行读取的,如果您将脚本放在一长行中,则会失败。不过,只有第一行应该有 --!jooscript: 前缀。

【讨论】:

【参考方案2】:

Inserting a script 仅支持 LO 文本或 html 文件。 但是您可以通过将 Writer OLE 对象插入到 Calc 表中来使用解决方法(菜单“Insert”->“Object”->“OLE Object " -> "LibreOffice 4.2 Text")。在 OLE 对象中,“Insert”->“Script”的工作方式与在“本机”.odt 文件中的工作方式相同。该脚本也会出现在.ods 文件的content.xml 中。

编辑:抱歉,没有像我希望的那样工作 - 实际上脚本代码将放置在不同的 content.xml 中(OLE 对象在子目录中有自己的 context.xml),但不在 ods 中content.xml.

【讨论】:

不幸的是(因为我对这个答案感到非常兴奋),它没有...... content.xml 中显示的是一个嵌入对象,它指的是文件夹中的“Object1” ods 文件,其中有一个单独的 content.xml 用于文本文档。该单独的文档显示 呃哦 - 你说得对,我只是为我的示例脚本的内容做了一个快速的grep -R,并没有注意到我在Object 1 子目录中得到了点击......我'对此我深表歉意! 没问题,公平的尝试。如果没有常驻的 *** 天才想出我们缺少的东西,我会回过头来看看 jodreports 代码,看看我是否可以让它适用于其他标签。

以上是关于LibreOffice Calc 中的脚本的主要内容,如果未能解决你的问题,请参考以下文章

用于 Libreoffice-calc 和 Openoffice-calc 的 Python“Hello World”[关闭]

使用命令行使用 Libre Office 将 xls 转换为 dbf

如何使用 bash 脚本从许多 excel/Libre Office Calc 表中提取数据?

如何从命令行 Python 脚本将所有工作表保存在 LibreOffice Calc 电子表格中

用 JS 调用 LibreOffice Calc

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