LibreOffice Calc中的脚本

时间:2014-07-01 16:19:17

标签: java freemarker libreoffice

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这可以通过更改jodreports代码来解决。这不会在<text:script>文件中添加请求的.odt标记,因此严格来说这可能不是特定问题的答案,但它将解决让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:前缀。

答案 1 :(得分:0)

Inserting a script仅支持LO文本或html文件。 但您可以通过将Writer OLE对象插入到Calc表中来使用解决方法(菜单&#34; Insert&#34; - &gt;&# 34; Object&#34; - &gt;&#34; OLE Object&#34; - &gt;&#34; LibreOffice 4.2 Text&#34;)。在OLE对象内,&#34; Insert&#34; - &GT; &#34; Script&#34;的工作方式与&#34; native&#34;相同。 .odt个文件。该脚本也会显示在content.xml文件的.ods中。

编辑:抱歉,我没有按照我的意愿工作 - 事实上,脚本代码将放在不同的content.xml中(OLE对象在子目录中有自己的context.xml),但不是在“ods&#39; content.xml