Альтернатива Createobject()

Тема в разделе "Lotus - Программирование", создана пользователем alik86, 5 июн 2014.

  1. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Доброго времени всем!
    И так...
    Ситуация:
    Имеется приложение, состоящее из некоторого количества баз Lotus. Начиная с незапамятных времен в приложении работает функционал интеграции с MS Office (тут все: и Word, и Excel, и PowerPoint) -- тут и создание файлов с нуля, и создание их по шаблону... У основания всех этих дел лежит LotusScript CreateObject() function.
    Некоторое время назад поступила вводная о том, что всё больше и больше пользователей переходят на OpenOffice, но многие и не переходят.
    Хорошо. Был разработан функционал, который дает пользователю право выбора офиса. У основания всего этого (это уже мной) так же был положен CreateObject(). И так всё красиво работало.
    И вот поступает очередная вводная о том, что теперь надобы позаботиться и о пользователях Linux.

    Вопрос:
    Что же делать? Как же быть? Как наиболее безболезненно отказаться от CreateObject() дабы было хорошо и пользователям Linux?

    Мои мысли:
    Оно вроде как у Apache OpenOffice 4.x.x есть богатая API (в частности глаз косится на java, но не побрезговал бы и OpenOffice.org Basic). Вроде как ее и хотелось бы использовать. Но как? С чего начать? Ума не приложу?
    Вот, например, простенький код создания Calc документа:
    Код (Text):
    Sub Click(Source As Button)
    Dim wsp As New NotesUIWorkspace
    Dim oSM, oDesk, oDoc As Variant
    Dim args()

    Set oSM = CreateObject("com.sun.star.ServiceManager")
    Set oDesk = oSM.CreateInstance("com.sun.star.frame.Desktop")
    Set oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)      
    End Sub
    Как в лотусе сделать то же самое но без CreateObject()?

    Идеи, советы, подсказки, ссылки?
    Спасибо! :)
     
  2. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
  4. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Спасибо откликнувшимся!
    Посмотрел. Попробовал.
    В ссылке от lmike (да и в былых Ваших изысканиях на эту тему) смущает остутствие apache.org в пруфлинках.
    Ссылка garrickа смущает меньше, но всё же что-то есть.
    Может в конечном итоге мне ничего и не останется кроме как прийти к одной из них, но пока я предпринимаю попытки разобраться с самым что ни на есть родным для Apache OpenOffice (на мой взгляд) The Apache OpenOffice API Project
    Но вот что-то не очень получается прикрутить это дело к nsf.
    Что я делаю:
    1. Читаю Prepare the Eclipse IDE
    2. Создаю у себя в базе библиотеку Java (назову ее TestJava) и импортирую в нее juh.jar, jurt.jar, ridl.jar, unoil.jar из ..\OpenOffice 4\program\classes.
    3. Создаю в этой библиотеке класс
    Код (Text):
    public class Trial {   
    public static void createDocument(){
    try{
    // Get the remote office component context
    com.sun.star.uno.XComponentContext xContext = null;
    xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
    // Get the remote office service manager
    com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager();
    // Get the root frame (i.e. desktop) of openoffice framework.
    Object oDesktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
    // Desktop has 3 interfaces. The XComponentLoader interface provides ability to load components.
    com.sun.star.frame.XComponentLoader xCLoader = ( com.sun.star.frame.XComponentLoader ) com.sun.star.uno.UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop);
    // Create a document
    com.sun.star.lang.XComponent document = xCLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new com.sun.star.beans.PropertyValue[0]);
    } catch( Exception e) { }
    }
    }
    (и, хочу заметить, никакой ругани не встречаю).
    Т.о. я ожидаю, что метод createDocument() должен сделать то же, что и пример в моём первом сообщении.
    4. Пытаюсь вызвать метод createDocument()
    Код (Text):
    UseLSX "*javacon"
    Use "TestJava"
    Sub Trial()
    Dim jSession As JavaSession
    Dim jClass As JavaClass
    Dim jObject As JavaObject

    Set jSession = New JavaSession()
    Set jClass = jSession.GetClass("Trial")
    Set jObject = jClass.CreateObject()
    Call jObject.createDocument()
    End Sub
    Sub Click(Source As Button)
    Call Trial()
    End Sub
    Но не происходит ровным счетом ничего и в ответ тишина.

    Так что же я делаю не так?

    P.S. Нечто подобное пытался провернуть и с "Apache ODF Toolkit (incubating)" -- полёт такой же. С "XDocReport" еще не пробовал, но что-то мне подсказывает, что и там будет то же самое.
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    а что должно произойти? :)
    ведь дальше нет сохранения файла
    см. взаимодействие с FileOutputSrteam, я выкладывал
     
  6. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    В чём разница?
    OpenOffice API - манипулирует документами OpenOffice при наличии оного на компьютере где производится эта манипуляция, что-то наподобие майкрософтовского OLE.
    ODF Toolkit - API для формирования и изменения документов OpenOffice без его наличия. Файлы формируются и редактируются напрямую. Если я ничего не путаю, то в отличии от OpenOffice API нельзя задействовать скриптовые языки OpenOffice (типа VBA в Word).
    Simple ODF (ссылку я приводил ранее) - высокоуровневая обёртка над ODF Toolkit.
    XDOCReport - позволяет заполнять данными шаблоны DOCX и ODF. В своей работе использует DOCX4J, ODF Toolkit, Apache POI, Velocity или Freemaker и iText (для формирования PDF), и кучу всего ещё по мелочи. Не факт что вся эта хренотень запустится в лотусовой JVM - надо экспериментировать.

    А по коду. Да. вы только создаёте файл, ничего не пишите в него и не сохраняете. Или вы ожидаете, что что должно открыться окно редактора, как в Word OLE. Нет - этого не будет.
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    запустится ;) - я уже делал - на ура
    нотусня д.б. с жвм 1.5+

    Добавлено: причем сам докХэ положил прям в ресурсы джава проекта, либы в jvm/lib/ext, код взял из примера, запуск в космос: DocxNativeLineBreakAndTabWithVelocity.main(new String[]{""});

    Добавлено: и, понятно, все либы класть необязательно, ежели нет нужды юзать (например docx4j, freenaker, itext, poi)

    Добавлено: чем не нра simple ODF... на этапе счупания - все грузил в память, ну и для случая шаблонов - ну очень много ручного труда
    велосити рулед :)
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    про OpenOffice API присутствие ОО несколько напрягает (для клиента не критично), но на хабре описан рабочий сюжет по каментам - рекомендуют не закрывать процесс и прибивать по таймауту, в случае зависонов
    с шедульными агентами - не пройдет (можно сервак завесить), но есть DOTS, хотя и офиц. на поддерж.
     
  9. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    XDOCReport - пробовал сделать генерацию однотипных документов по форме, надо было сгенерить примерно 10 000 шт. Запускалось как отдельное приложение, часть данных брало из Lotus Notes, часть из Oracle. Сначала всё было здорово, но где-то на 2-ой или 3-ей тысячи оно ёкнулось. ...и так несколько раз подряд. Разбираться отчего и почему не было времени - сделал на FOP.
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
  11. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Это да. Но я то использовал DOCX-POI-Velocity-iText конвертер.
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    у меня вообще сложилось впечатление сырости конвертора...
    замена в хмл - это не так критично, как цепочка конвертации
    я смотрел просто POI 3.9 - там есть особенности конвертации doc (docx не проверял) , на форуме постил по этому поводу
    правда там я использовал готовый вариант DOC->POI->FOP (и без velocity, просто тест)
     
  13. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Хм, заигрывания с XDocReport, похоже, придется прекратить, не начиная, ибо "XDocReport is Java API to merge XML document created with MS Office (docx, pptx) or OpenOffice (odt)", а у меня то еще и таблицы, и презентации имеются. Да и форматы MS Office без x нужны (.doc, .xls, .ppt). Или оно и это умеет? <_<
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    alik86 секундочку, топик начинался за ОО, а заканчиваем doc
    если взялись переводить на ОО - то и незачем doc пользовать
    пресохраните doc -> docx
    упор либы на ХМЛ
    старые форматы - это POI, но горя хлебнете... (ибо сам doc - это очстранное сочетание)
     
  15. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Ну как же? Недоразъяснил выходит. Попробую еще раз. <_<
    Есть приложение, в нем имеется функционал интеграции с MS Office: Word, Excel, PowerPoint). Функционал различный: и создание файлов с нуля, и создание их по шаблону, сохранение и атаченье файлов к документам lotus, показ сформированных документов пользователю без сохранения и т.п.
    Приложение изначально было рассчитано на пользователей MS Windows и Office. Но со временем у приложения появились пользователи Windows, использующие в качестве офисного пакета OpenOffice. Для этих пользователей был написан аналогичный функционал, во главе которого лежит CreateObject("com.sun.star.ServiceManager"). Теперь же стала задача озаботиться еще и пользователями Linux и OpenOffice. Но это вовсе не значит, что надо позабыть о предыдущих группах пользователей. О полном переводе на OO и отказе от MS речи не идет.
    Ну а формат .doc? Это как бы тот формат, который относительно безболезненно могут редактировать пользователи всех офисов: MS Office 2003 up, OpenOffice.
    Т.е. меня (во всяком случае на первом этапе) больше интересует некая "затычка" для Linux.
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    с таким зоопарком, без компромиссов - никак
    проперпоинт: если не шаблонизации - наплевать и забыть. Делать PDF, как бонус - нет необходимости в присут. ПП на компе, из "недостатков" (кот. я считаю плюсами) - отсутствие анимации
    Но учитывая как у нас создают презы - сомневаюсь что кто-то пойдет по этому пути <_<

    ворд: старый формат - POI, и опять - если не нужно править руками (сгенеренный док) - PDF. Новый формат - выше
     
  17. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    Garrick (а так же lmike и все, все, все), а заводили ли Вы Simple ODF из-под лотуса?
    Я начал пробовать и сразу столкнулся с проблемой создания нового текстового документа методом newTextDocument().
    Оно ругается:
    org.odftoolkit.odfdom.pkg.OdfPackageDocument$Resource createInputStream
    SEVERE: Could not find resource: /OdfTextDocument.odt

    Я уже вроде и файлик с таким именем создал, и в ресурсы базы его клал, и в ресурсы бибилиотеки, и просто в папку с ntf'кой -- всё мимо.
    Код:
    Код (Text):
    Sub CreateDocument()
    Dim jSession As JavaSession
    Dim jClass As JavaClass
    Dim jObject As JavaObject

    Set jSession = New JavaSession()
    Set jClass = jSession.GetClass("org.odftoolkit.simple.TextDocument")    
    Set jObject = jClass.newTextDocument()  'ругается на это
    'Set jObject = jClass.loadDocument("c:\\tmp\\template.odt") 'если предыдущую строку заменить этой, то всё работает
    Call jObject.addParagraph("Hello World!")
    Call jObject.save("c:\\tmp\\CreatedDocument.odt")      
    End Sub
    Что за дела такие?
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    ну судя по сообщению - он хочет в корне создать файл - а оно так позволено?

    Добавлено: да и потом - что это за фокус - объект не создан по конструктору
     
  19. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Вот так работает:

    Код (Text):
    import lotus.domino.AgentBase;
    import lotus.domino.Session;

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.program.Program;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.FileDialog;
    import org.eclipse.swt.widgets.Shell;
    import org.odftoolkit.simple.TextDocument;
    import org.odftoolkit.simple.table.Cell;
    import org.odftoolkit.simple.table.Table;
    import org.odftoolkit.simple.text.list.List;

    public class JavaAgent extends AgentBase {

    public void NotesMain() {

    try {
    Session session = getSession();
    Display display = Display.getCurrent();
    if (display == null) {
    display = Display.getDefault();
    }
    if (display == null) {
    display = new Display();
    }
    TextDocument outputOdt;
    outputOdt = TextDocument.newTextDocument();
    // add paragraph
    outputOdt.addParagraph("Hello World, Hello Simple ODF!");
    // add list
    outputOdt.addParagraph("The following is a list.");
    List list = outputOdt.addList();
    String[] items = { "item1", "item2", "item3" };
    list.addItems(items);
    // add table
    Table table = outputOdt.addTable(2, 2);
    Cell cell = table.getCellByPosition(0, 0);
    cell.setStringValue("Hello World!");

    final Shell shell = new Shell(display);
    //shell.open();
    FileDialog dialog = new FileDialog(shell, SWT.SAVE);
    dialog.setText("Save...");
    dialog.setFilterNames(new String[] { "Open Office Document" });
    dialog.setFilterExtensions(new String[] { "*.odt" });

    dialog.setFilterPath(System.getProperty("user.home"));
    dialog.setFileName("HelloWorld.odt");
    String filename = dialog.open();
    outputOdt.save(filename);
    shell.close();         
    Program.launch(filename);          
    while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    display.dispose();
    session.recycle();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    давайте все по-порядку...
    ифали имеем статический метод - то вор должен сидеть в тюрьме jar должен лежать в jvm путях (jvm/lib/ext)...
    ну просто потому, что инициализация должна произойти до запуска остального кода класса (как это предполагается в штатной работе вне нотусёв)
    в бридже это может оказаться иначе (КМК)

    Добавлено: garrick а что СВТ нормально отрабатывает в >7.x
     
Загрузка...

Поделиться этой страницей