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 表中提取数据?