Про Excel, Word...

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#1
Вступление
Наш современный мир ориентирован на использование компьютеров. Магазины забиты макулатурой из разряда "Excel - это просто".
Компьютерные курсы активно продвигают МСО (МикроСофт Офис) и обучают работе с ним.
В резюме офисные работники все! указывают на "умение работать" с МСО...

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

Обоснование
Цель моего "обращения" не перечислить "ужасы", а "поговорить" об интеграции всего этого богатства с системами документооборота.
Я рассматриваю LDN (Lotus Domino Notes), как платформу (по понятным, "здесь", причинам)
Про Ворд говорить не буду, потому как вопрос сложен - по сей день нет полноценных средств для работы с его сущностями (ситуация, по состоянию на 2014, стала лучше: DOCX +
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
,
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
) и особенностями (он сам может глючать на своих же файлах)
остаётся (из МСО розлива стандарт) 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
Содержимое следующее:
Код:
import com.extentech.toolkit.*;
import com.extentech.ExtenXLS.*;
 
public class Untitled {
 
}
а можем этого и не делать (опционально - если нам нужна доп. ф-циональность, кот. в LS получить сложно/невозможно, через LS2J)
класс неопределён, в данном случае - не нужно
далее подключение:
Код:
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
типа:
Код:
Dim Sheet As JavaObject
Set Sheet=openXLSObj.getWorkSheet(0)
как видим отличий в сложности, от COM - мало, в случае с ОСС (Опен Софт Софтваре, OSS) есть плюсы..., библиотеки на java, практически всегда, достаточно хорошо описаны, бесплатно, не требует установки МСО
ЧТД
Акцентирую, ещё раз, внимание - все описания методов и применение - есть в архиве (по ссылке выше) и искать, в разных источниках - нет нужды
 
Последнее редактирование модератором:

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#2
Замечательный пост!
Пару чайных ложек дёгтя в эту цистерну мёда:
1. В Excel есть запись макросов, которая позволяет генерировать код, требующий относительно небольших доработок и минимального обращения к справке.
2. При генерации с помощью COM листов Excel для "масштабируемой печати изображений" файл сохранять необязательно . Можно просто сделать Excel видимым и отдать его "на растерзание" пользователю.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#3
1. В Excel есть запись макросов, которая позволяет генерировать код, требующий относительно небольших доработок и минимального обращения к справке.
спасибо за оценку ;)
есть-то оно есть, но увы - качество генерации таково, что лучшебы не было (чтобы соблазн отсутсовал)
нет "прямого" обращения в поиску в массиве (сам-то хехель ищет ;) ) - можно только хаком (типа: Application.Match(key, Application.Transpose(sourceIndex), 0)), либо перебором/реализацией своего (перформанс никакой будет)...
т.е. программировать придётся ещё и дополнительно
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#4
добавлю обработчик ошибок (ничего нового, просто напоминание):
Код:
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
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#5
2. При генерации с помощью COM листов Excel для "масштабируемой печати изображений" файл сохранять необязательно . Можно просто сделать Excel видимым и отдать его "на растерзание" пользователю.
я забыл деталь...
МСО полюбасу создаёт временные файлы, а потому - "экономия" на файле мне кажется малозначимой
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#6
ещё деталь...
итерировать массивы, получаемые на выходе, можно через forall:
Код:
	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
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#7
тонкость, при возврате null
java может возвращать null, в методах получения объектов, как например:
cell.getMergedCellRange();
этот метод возвращает смёрдженый диапазон или null (если ячейка не мерджена)
если мы захотим присвоить результат переменной в LS, то в случае с null - получим Type Mismatch!
потому, везде, где null вполне может возвратиться, делаем проверку, например так:
Код:
		Forall cell In cells
If Not Isnull(cell.getMergedCellRange()) Then
Dim rng 'CellRange
Set rng=cell.getMergedCellRange()
Msgbox "Merged"
End If
End Forall
 
Последнее редактирование модератором:

NetWood

Well-Known Member
Lotus team
17.04.2008
370
16
Питер
#8
Возможные причины использования COM:
-незнание java
-незнание LS2J
-уверенность в простоте COM
Добавлю еще одну: - есть обилие примеров на LS, напрмер експорт/импорт. Тут же писали про "тонны LS кода" :)

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

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#9
Честно, я Яву просто боюсь. Смотрю на нее как баран на новые ворота smile.gif ибо программером никогда не был. Вот и просьба соответственно. Возможно и не мне одному будет полезна. Кусок кода, а лучше тестовую базу где експорт из Excel таблички, скажем прайса, и импорт обратно.
ну то что указано выше - на джава ничего писать не надо!
также как и с КОМ - только LS
пример - не сложно, Excel указан, а во что экспорт и из чего импорт?
практически, то что написано - уже дает данные в LS
 
H

helge

Гость
#10
ps. Вот у нас же есть вяло текущий общий проект на Гугле с PDF бубнами. Может в нем добить? Вообще давно была такая мысля как на codestore сделать похожее. Всетаки буржуины там не зря хлеб кушают. Сделали одну базу dext.nsf и в нее всякие примеры добавляют. Кому что надо пользуется. Давайте, народ, подключайтесь. Кто что сможет http://codeby.net/ipb.html?s=&sh...st&p=175544 и тут
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
Ух ты! Молодцы! Надо будет и свою лепту внести) Тем более, что на java последнее время проекты приходятся. Нужно поднимать скиллы.
 

Gandliar

Well-Known Member
Lotus team
16.02.2004
326
6
44
Минск
jobber.by
#11
Вопрос по теме.

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#12
смысл всегда есть (убрать ОЛЕ и МСО в частности), получится не чёрный ящик, а управляемый, кроссплатформенный код
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#13
приложу, пожалуй, весь спектр продуктов компании (кот. поставляет OpenXLS)
акцентирую внимание, что OpenXLS бесплатен! (просто формат файлов до 2003 хехеля, и возможно - ограничения по перформансу)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#15
добавил много чего...
парсинг текстового файла (CSV, разделители ";"), апдейт из файла по ключевой колонке...
редизайн кода (на объектный) и добавление классов для текстового файла
описание ещё не менял - пойзже
в архиве тектовой файл (получен из Excel, экпортом) и шаблон
Посмотреть вложение OpenXLS.zip
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#16
версия 1.0.4b, с обработкой папки "Входящие", кофигурационный документ, для обработки...
док эбаут дополнил (слегка)
проверка обработки:
-помещаем док Memo в папку "Входящие" (можно перенести дрыг-н-дропом из "Обработанные")
-меняем ч-л (цену например - CurrDoc.Price колонка), в приаттаченном файле (через редактирование и сохранение)
-запускаем агент test\Processing
-сморим изменения в вьюшке "Товары"

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#17
код доработан, но для др. базы, в текущую его перенёс
проверял ф-ционал поверхностно, потому - прошу указывать на глюки
1.0.5b, фичи в эбауте:
-форма для импорта определена в доке конфигурации
-возможность множественных конфигураций в одной операции импорта (из одного внешнего файла, получаем документы по нескольким формам)
-множественный ключ, для отслеживания уникальности (в доке конфигурации)
Посмотреть вложение OpenXLS.ntf.zip

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#18
очередная версия (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,")
опции отделяются от имени поля символом "{", сами опици разделяются символом "|" - это задано в библиотеке константами
Код:
'Константы конфигурация полей
Const OPTIONS_SIGN="{"
Const SEP_SIGN={S,} 'указывает на разделитель списка (,)
Const APPEND_SIGN={:} 'символ дополнения поля
'в конфигурации - обозначает, что поле должно дополняться значениями (а не перезаписываться)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#19
след. версия, из тех изменений что вспомнил:
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 ;)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#20
дальнейшие цели:
-использование шаблонизатора репортов http://jxls.sourceforge.net/index.html. Учитывая что он опирается на POI
-подключение экспорта в ПДФ
-сделать опции загрузки подключаемыми по некоему интерфейсу (щас некрасиво нахрдкодено), в виде объектов, кот. получают по цепочке строки

возможно в рамках этойже БД будут попытки обработки с пом. FOP (как описывал) из вордовых b из нотусёвых доков. Т.к. здесь уже используется POI...
хотя касание к Excel не будет никакого ;)
ЗЫЖ надо будет только базу переименовать ;)