这可以通过更改 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: 前缀。