Скрипт в LibreOffice Calc

1

С 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 чтобы ввести мой скрипт...

Есть идеи?

Теги:
freemarker
libreoffice

2 ответа

0
Лучший ответ

Это можно решить с изменением кода 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:

0

Вставка скрипта поддерживается только для текстовых или текстовых файлов 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,

  • 1
    К сожалению (потому что я был действительно взволнован этим ответом), он не ... То, что показано в content.xml, является объектом для встраивания, который ссылается на папку «Object1» в файле ods, в которой есть Отдельный файл content.xml для текстового документа. Этот отдельный документ показывает тег <text: script>, но основной файл content.xml не ...
  • 0
    О, да, вы правы, я просто сделал быстрый grep -R для содержимого моего примера сценария и не заметил, что получил попадание в подкаталог Object 1 ... я сожалею об этом!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню