【问题标题】:Script in LibreOffice CalcLibreOffice 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 会完成这项工作......

有什么想法吗?

【问题讨论】:

    标签: java freemarker libreoffice


    【解决方案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 子目录中得到了点击......我'对此我深表歉意!
      • 没问题,公平的尝试。如果没有常驻的 stackoverflow 天才想出我们缺少的东西,我会回过头来看看 jodreports 代码,看看我是否可以让它适用于其他标签。
      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多