Про Excel, Word...

Тема в разделе "Lotus + Java + LS2J", создана пользователем lmike, 14 фев 2011.

  1. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    Вступление
    Наш современный мир ориентирован на использование компьютеров. Магазины забиты макулатурой из разряда "Excel - это просто".
    Компьютерные курсы активно продвигают МСО (МикроСофт Офис) и обучают работе с ним.
    В резюме офисные работники все! указывают на "умение работать" с МСО...

    ВОТ он - источник "проблем", и почему - я, ниже, коротко объясню.
    После такой активной "накачки" и лозунга от БГ (Била Гейтса) "компьютеризация может помочь каждой домохозяйке", офисный работник начинает являть чудеса в использовании компьютера.
    Он (офисный работник) "не без оснований" предполагает, что его деятельность чем-то близка с дизайнером/архитектором проектов/разработчиком (в т.ч. БД/алгоритмов/нетленного кода)
    Результат предсказуем: имея под рукой терабайтные (на теперешний момент) виндозные файлопомойки - он захламляет их продуктами своей гениальности...
    Сложно вложенные названия каталогов и оригинальные названия файлов (ну ктож ему говорил, что есть мета теги), дублирование информации, отсутствие нормального поиска.
    Из моих наблюдений: отдел из 10-и человек создаёт (за два/три года) порядка 20тысяч файлов
    Потрясающая цифра - ведь каждый файл МСО содержит стр-ру унутре
    Эпос про Word можно прочесть, например, здесь - http://habrahabr.ru/blogs/development/110019/

    Обоснование
    Цель моего "обращения" не перечислить "ужасы", а "поговорить" об интеграции всего этого богатства с системами документооборота.
    Я рассматриваю LDN (Lotus Domino Notes), как платформу (по понятным, "здесь", причинам)
    Про Ворд говорить не буду, потому как вопрос сложен - по сей день нет полноценных средств для работы с его сущностями (ситуация, по состоянию на 2014, стала лучше: DOCX + xdocreport, перенесли на гитхаб) и особенностями (он сам может глючать на своих же файлах)
    остаётся (из МСО розлива стандарт) Excel
    Для чего его используют:
    -как БД
    -как средство распространения прайс-листов
    -как средство для вычислений
    -как сводную таблицу
    -как средство масштабируемой печати изображений (есть и такое ;) )

    Все эти фичи, МС старательно туда (в эксель) впихивало/проталкивало/пиарило... Всё это эксель умеет, но... - хуже чем специализированные средства
    А с добавлением офисного работника - эксель обретает "невиданную" разрушительную силу.
    Т.о. цель - извлечь/передать данные из/в эксель файл и интегрировать их с "системой"

    Основным "принятым" методом общения с эксель, среди "наших" коллег, являет использование COM объектов
    В тоже время - существуют библиотеки на java и возможность их использования через LS2J
    Возможные причины использования COM:
    -незнание java
    -незнание LS2J
    -уверенность в простоте COM

    Простота COM условна, работать придется с объектом, описание кот. тщательно размазано по MSDN, хелпу, поисковым запросам в Интернете.
    При использование объектов в LS (Lotus Script) придется:
    -искать значения констант
    -подбирать методы их передачи (нельзя определить по имени опциональные)
    -сталкиваться со сложностью отладки
    -ограниченность и плохое описание интерфейсов
    -скудные, плохо комментированные, примеры (в большинстве, в том числе МСО)
    -обилие примеров с ошибками, в виду "распространенности" подхода и кажущейся простоте COM

    С другой стороны:
    -для использование LS2J, надо прочесть (внимательно) немного информации в хэлпе дизайнера LDN.
    -библиотеки для работы с экселем (java) имеют описание (javadoc) АПИ и примеры
    -использовать их можно даже не зная java

    Применение
    Рассмотрю библиотеку http://sourceforge.net/projects/openxls/
    Эта библиотека мне показалась достаточно зрелой, примеры использования показательны (они находятся http://sourceforge.net/projects/openxls/fi...6.zip/download)

    Кладём jar в jvm/lib/ext/
    Ссылаться на "сторонние" библиотеки, напрямую, используя LS2J, нельзя. можно ссылаться на библиотеки, если они к/л образом известны нотусам/домине
    Но мы можем "подключить", создав библиотеку java, внутри домино дизайнера
    Назовем её OpenXLS
    Содержимое следующее:
    Код (Text):
    import com.extentech.toolkit.*;
    import com.extentech.ExtenXLS.*;
     
    public class Untitled {
     
    }
    а можем этого и не делать (опционально - если нам нужна доп. ф-циональность, кот. в LS получить сложно/невозможно, через LS2J)
    класс неопределён, в данном случае - не нужно
    далее подключение:
    Код (LotusScript):
    Option Declare
    Use "OpenXLS"
    Dim jSession As JavaSession
    Dim OpenXLSClass As JavaClass
    Dim OpenXLSObj As JavaObject 'WorkBookHandle
    Dim sName As String
     
    sName="путь с Excel файлу, включая название файла"
    Set jSession= New JAVASESSION
    'две строчки, ниже, сложнее в восприятии чем инициализации объекта в КОМ
    'но это не так страшно ;)
    Set OpenXLSClass = jSession.GetClass("com/extentech/ExtenXLS/WorkBookHandle")
    Set OpenXLSObj = OpenXLSClass.CreateObject("(Ljava/lang/String;)V", sName)
    Print "Cell string value:" & openXLSObj.getWorkSheet(0).getCell("A2").getStringVal()
    обработку ошибок - "добавить по вкусу" ;)
    промежуточные объекты можно сохранять (если необходимо) в переменные типа JavaObject
    типа:
    Код (LotusScript):
    Dim Sheet As JavaObject
    Set Sheet=openXLSObj.getWorkSheet(0)
    как видим отличий в сложности, от COM - мало, в случае с ОСС (Опен Софт Софтваре, OSS) есть плюсы..., библиотеки на java, практически всегда, достаточно хорошо описаны, бесплатно, не требует установки МСО
    ЧТД
    Акцентирую, ещё раз, внимание - все описания методов и применение - есть в архиве (по ссылке выше) и искать, в разных источниках - нет нужды
     
    #1 lmike, 14 фев 2011
    Последнее редактирование модератором: 15 сен 2015
    2 пользователям это понравилось.
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Замечательный пост!
    Пару чайных ложек дёгтя в эту цистерну мёда:
    1. В Excel есть запись макросов, которая позволяет генерировать код, требующий относительно небольших доработок и минимального обращения к справке.
    2. При генерации с помощью COM листов Excel для "масштабируемой печати изображений" файл сохранять необязательно . Можно просто сделать Excel видимым и отдать его "на растерзание" пользователю.
     
  3. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    спасибо за оценку ;)
    есть-то оно есть, но увы - качество генерации таково, что лучшебы не было (чтобы соблазн отсутсовал)
    нет "прямого" обращения в поиску в массиве (сам-то хехель ищет ;) ) - можно только хаком (типа: Application.Match(key, Application.Transpose(sourceIndex), 0)), либо перебором/реализацией своего (перформанс никакой будет)...
    т.е. программировать придётся ещё и дополнительно
     
  4. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    добавлю обработчик ошибок (ничего нового, просто напоминание):
    Код (LotusScript):
    Function RaiseError_mod() As String
    Dim jError As JavaError
    Dim modInfo As String  
    modInfo = Getthreadinfo(LSI_THREAD_MODULE) & "::" & Getthreadinfo(LSI_THREAD_CALLPROC) & ": "
    Set jError = jSession.getLastJavaError()
    Dim es As String
    If (jError.errorMsg = "") Then
    es=modInfo
    If (Err = 0) Then
    es = es + "Manually raised an error"
    Else
    es = es + "Run time error: (" + Trim(Str(Err)) + ") " + Error$ + " at line: "+ Trim(Str(Erl))
    End If
    Else
    es=modInfo+"Error at line " & Erl & ": " & jError.errorMsg
    Print es
    jSession.ClearJavaError        
    End If
    RaiseError_mod=es
    End Function
     
    #4 lmike, 14 фев 2011
    Последнее редактирование модератором: 20 июн 2015
  5. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    я забыл деталь...
    МСО полюбасу создаёт временные файлы, а потому - "экономия" на файле мне кажется малозначимой
     
  6. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ещё деталь...
    итерировать массивы, получаемые на выходе, можно через forall:
    Код (LotusScript):
        Dim Sheet As JavaObject
    Set Sheet=openXLSObj.getWorkSheet(0)
    Dim rows
    rows=Sheet.getRows()
    Dim l As Long
    l=Ubound(rows)
    Print "Rows Count:" & Cstr(l)
    '   Exit Sub   
    Forall row In rows
    Forall cell In row.getCells()
    Print cell.getCellAddress()
    End Forall
    End Forall
    обращу внимание на "особенности":
    -в джава мы получаем Vector, кот. преобразуется бриджом в Variant
    -пропертей length (свойственных Vector) не будет! и размер получаем как Ubound
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    тонкость, при возврате null
    java может возвращать null, в методах получения объектов, как например:
    cell.getMergedCellRange();
    этот метод возвращает смёрдженый диапазон или null (если ячейка не мерджена)
    если мы захотим присвоить результат переменной в LS, то в случае с null - получим Type Mismatch!
    потому, везде, где null вполне может возвратиться, делаем проверку, например так:
    Код (LotusScript):
            Forall cell In cells
    If Not Isnull(cell.getMergedCellRange()) Then
    Dim rng 'CellRange
    Set rng=cell.getMergedCellRange()
    Msgbox "Merged"
    End If
    End Forall
     
    #7 lmike, 15 фев 2011
    Последнее редактирование модератором: 20 июн 2015
  8. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    Добавлю еще одну: - есть обилие примеров на LS, напрмер експорт/импорт. Тут же писали про "тонны LS кода" :)

    Собственно это одна из базовых решаемых задач. Честно, я Яву просто боюсь. Смотрю на нее как баран на новые ворота :) ибо программером никогда не был. Вот и просьба соответственно. Возможно и не мне одному будет полезна. Кусок кода, а лучше тестовую базу где експорт из Excel таблички, скажем прайса, и импорт обратно. Вот тут буду весьма и премного благодарен, так как добавить пару строк способен, а сшить блоки в яве это уже пилотаж :) для меня.

    А на Линухе это будет работать? Давно бы спрыгнул с WIN тела на Линукс, но есть агенты котрые через Excel все обновляют, соответственно нужен COM и прочее. Была попытка выкурить экспорт/импорт при помощи OpenOffice средств, но потонула ввиду отсутствия примеров и не нашел ничего в общем :(

    ps. Вот у нас же есть вяло текущий общий проект на Гугле с PDF бубнами. Может в нем добить? Вообще давно была такая мысля как на codestore сделать похожее. Всетаки буржуины там не зря хлеб кушают. Сделали одну базу dext.nsf и в нее всякие примеры добавляют. Кому что надо пользуется. Давайте, народ, подключайтесь. Кто что сможет http://codeby.net/ipb.html?s=&sh...st&p=175544 и тут https://sites.google.com/site/lmiketonetwoodproject/
     
  9. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ну то что указано выше - на джава ничего писать не надо!
    также как и с КОМ - только LS
    пример - не сложно, Excel указан, а во что экспорт и из чего импорт?
    практически, то что написано - уже дает данные в LS
     
  10. helge

    helge Гость

    Ух ты! Молодцы! Надо будет и свою лепту внести) Тем более, что на java последнее время проекты приходятся. Нужно поднимать скиллы.
     
  11. Gandliar

    Gandliar Well-Known Member

    Регистрация:
    16 фев 2004
    Сообщения:
    222
    Симпатии:
    0
    Вопрос по теме.

    Есть импорт прайс-листов из экселе написанный на скрипте, используя OLE
    Вопрос, есть ли смысл переписать под java с точки зрения быстродействия?
     
  12. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    смысл всегда есть (убрать ОЛЕ и МСО в частности), получится не чёрный ящик, а управляемый, кроссплатформенный код
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    приложу, пожалуй, весь спектр продуктов компании (кот. поставляет OpenXLS)
    акцентирую внимание, что OpenXLS бесплатен! (просто формат файлов до 2003 хехеля, и возможно - ограничения по перформансу)
     
  14. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  15. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    добавил много чего...
    парсинг текстового файла (CSV, разделители ";"), апдейт из файла по ключевой колонке...
    редизайн кода (на объектный) и добавление классов для текстового файла
    описание ещё не менял - пойзже
    в архиве тектовой файл (получен из Excel, экпортом) и шаблон
    Посмотреть вложение OpenXLS.zip
     
  16. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    версия 1.0.4b, с обработкой папки "Входящие", кофигурационный документ, для обработки...
    док эбаут дополнил (слегка)
    проверка обработки:
    -помещаем док Memo в папку "Входящие" (можно перенести дрыг-н-дропом из "Обработанные")
    -меняем ч-л (цену например - CurrDoc.Price колонка), в приаттаченном файле (через редактирование и сохранение)
    -запускаем агент test\Processing
    -сморим изменения в вьюшке "Товары"

    пример:
    в базе, в первом доке для обработки (папка - "Входящие", subj - test1), значение "первой значимой" строки (в xls она вторая), в колонке CurrDoc.Price - 27, во втором (test2) - 28
    после запуска агента можем убедиться - 28, в колонке цена, вьюшки "Товары"
    Посмотреть вложение OpenXLS.ntf.zip
     
  17. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    код доработан, но для др. базы, в текущую его перенёс
    проверял ф-ционал поверхностно, потому - прошу указывать на глюки
    1.0.5b, фичи в эбауте:
    -форма для импорта определена в доке конфигурации
    -возможность множественных конфигураций в одной операции импорта (из одного внешнего файла, получаем документы по нескольким формам)
    -множественный ключ, для отслеживания уникальности (в доке конфигурации)
    Посмотреть вложение OpenXLS.ntf.zip

    Добавлено: в базе нет новых форм, есть только ф-ционал ("сильно" обновлённый и расширенный), пример множественного ключа, в конфигурациях см. Investment
    изменена форма загрузки (Create->Excel->Загрузка) и форма конфигурации (Create->Настройки->Обработка)

    забыл написать, в эбауте, о смердженных (объединённых) ячейках...
    коротко уже рассказывал, суть в обработке ячеек, объединённых по вертикали (горизонтальный вариант не имеет смысла - т.к. теряется понятие ключа).
    Обработка приводит к созданию одного дока из нескольких строк, причем объединению подвергаются по наибольшему варианту. Т.е., например, если объединены 2-е строки во второй колонке и 3-и в третьей, то результатом станет док с полями, в кот. объединены данные из 3-х строк. Пересечение не отслеживается (а стало-быть - результат мне не известен :) )
     
  18. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    очередная версия (1.0.6b)
    Посмотреть вложение OpenXLS.ntf.zip
    в версии расширена работа с полями, добавлена возможность дополнения поля (вместо замены)
    например укажем несколько колонок и обозначим их в маппинге одинаковым именем:
    field1;field2{:;field2{:
    что приведет к дополнению поля field2 значениями из 2-ой и 3-ей колонки (файла хехель)
    в случае
    field1;field2;field2{:
    будет замена field2 из 2-ой колонки и дополнение из 3-ей

    мультивэлью:
    field1;field2{:|S,
    и данные (колонки разделены, для наглядности, ";"):
    значение1;значение2,значение3
    результатом будет дополнение значения field2 (на это указывает ":") из 2-ой колонки, при этом будет интерпретировано как мультивэлью (с разделителем "," - обозначено как "S,")
    опции отделяются от имени поля символом "{", сами опици разделяются символом "|" - это задано в библиотеке константами
    Код (LotusScript):
    'Константы конфигурация полей
    Const OPTIONS_SIGN="{"
    Const SEP_SIGN={S,} 'указывает на разделитель списка (,)
    Const APPEND_SIGN={:} 'символ дополнения поля
    'в конфигурации - обозначает, что поле должно дополняться значениями (а не перезаписываться)
     
  19. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    след. версия, из тех изменений что вспомнил:
    1.0.8b:
    -добавлена работа с POI (libs: POI, XLS.LS2J), пока только для выгрузки. Причина - несовместимость получаемых файлов xls с MSO 2007-2010 в OpenXLS
    -переработано отображение форм выгрузки и загрузки (в ф-циональной части)
    -добавлено различие для импорта и эксопрта (поле в форме настроек), при Excel\Выгрузка будут отображаться только настройки для экспорта
    -в форме настроек добавлена возможность (при экспорте) использовать "ссылку" на поиск связанного документа (поля из него), в др. вьюшках. Пример:city{debtor,Debtors-Lookup; - здесь, по значению в поле debtor (документа из "основной" вьюшки), во вью Debtors-Lookup, ищем док (разумеется 1-я колонка проиндексирована по debtor) и получаем значение поля city
    -агент Jar Libraries 2 lib/ext, для "развертывания" выбранных библиотек в lib/ext. С его помощью необходимо развернуть POI, из настроек, настройка "POI for jvm 1.4+"
    -тестирование выгрузки производилось на LDN 7.0.4 (в другой базе, с др. дизайном, в текущей - не тестировалось)
    -для примера, в настройках выложена конфигурация "отчет по инвестициям", но соответ. вью/документы/поля отсутствуют и выгрузка не будет осуществлена
    БД Посмотреть вложение OpenXLS.ntf.zip документ с либами пустой (из-за ограничения размера загрузки) - там написаны файлы, кот. нужны,
    их выкладываю отдельно Посмотреть вложение poi.zip
    можно их впихнуть обратно в док, а можно сразу положить в lib/ext ;)
     
  20. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    дальнейшие цели:
    -использование шаблонизатора репортов http://jxls.sourceforge.net/index.html. Учитывая что он опирается на POI
    -подключение экспорта в ПДФ
    -сделать опции загрузки подключаемыми по некоему интерфейсу (щас некрасиво нахрдкодено), в виде объектов, кот. получают по цепочке строки

    возможно в рамках этойже БД будут попытки обработки с пом. FOP (как описывал) из вордовых b из нотусёвых доков. Т.к. здесь уже используется POI...
    хотя касание к Excel не будет никакого ;)
    ЗЫЖ надо будет только базу переименовать ;)
     
Загрузка...
Похожие Темы - Про Excel Word
  1. lmike
    Ответов:
    29
    Просмотров:
    11.186
  2. RzvCH
    Ответов:
    3
    Просмотров:
    903
  3. Zoger
    Ответов:
    2
    Просмотров:
    1.736
  4. pbnoob
    Ответов:
    1
    Просмотров:
    1.927
  5. egkalinichenko
    Ответов:
    0
    Просмотров:
    1.265

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