С LibreOffice Writer я могу вводить скрипты в документ (сценарий insert->). Они отображаются как <text:script script:language ="...">...</text:script>
в content.xml
.odt
-file. При использовании jar файла jodreports я могу заставить эти скрипты работать, как описано в http://jodreports.sourceforge.net/?q=node/25.
Теперь я хочу сделать то же самое для других типов документов LibreOffice, но нет возможности для insert-> скрипта в Calc или Impress. Единственное, что я вижу, это макросы, но они хранятся в отдельных файлах xml, а не в content.xml
. Я уверен, jodreports выполнит эту работу, если только я могу получить правильный тег в файле content.xml
чтобы ввести мой скрипт...
Есть идеи?
Это можно решить с изменением кода jodreports. Это не добавит требуемый <text:script>
в файл .odt
, поэтому он может строго не отвечать на заданный вопрос, но он решает основную проблему получения jodreports для игры с файлами LibreOffice Calc,
Изменение - с использованием кода jodreports 2.4.0 - находится в net.sf.jooreports.templates.xmlfilters
-package в файле 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:
Вставка скрипта поддерживается только для текстовых или текстовых файлов LO. Но вы можете использовать обходной путь, вставив объект OLE Writer, например, в лист Calc (меню " Insert
" → " Object
" → " OLE Object
" → " LibreOffice 4.2 Text
").Внутри объекта OLE " Insert
" → " Script
" работает так же, как в "родном" .odt
файле.Скрипт появится в файле content.xml
файла .ods
.
EDIT: Извините, не работает, как я надеялся - код скрипта фактически будет помещен в другой content.xml
(объект OLE имеет свой собственный context.xml
в поддире), но не в ods ' content.xml
,
grep -R
для содержимого моего примера сценария и не заметил, что получил попадание в подкаталогObject 1
... я сожалею об этом!