Форум поддержки пользователей LibreOffice, Apache OpenOffice

Главная категория => Макросы => Тема начата: dimmon777 от 4 июля 2017, 17:59

Название: Замена циркулярному письму
Отправлено: dimmon777 от 4 июля 2017, 17:59
Добрый день!
(В учреждении около 20 рабочих мест, как не пытался внедрить циркулярное письмо, ничего к сожалению не получается.)
Есть Excel (.ods)- таблица, в которую заносятся данные по организациям (свыше 15 тысяч наименований), ИНН, ОГРН, наименование, телефоны, и т.д. По итогу, нужно составить договора во Writer (- .odt).
В общем, при работе макроса получается следующее: 1- поиск в таблице по ключу, 2-назначение переменных,  3. В шаблоне,  Writer - предварительно расставлены "закладки", т.е. небольшие фрагменты, которые входе выполнения макроса заменяются (функция найти-заменить) между собой. Так например, ФИО_Руководителя -> Иванов И.В.
Как-бы нужно реализовать 3й пункт, через текстовые поля, т.е. изменяю имя одного параметра текста - меняются все текстовые подобные поля. ???
Название: Re: Замена циркулярному письму
Отправлено: mikekaganski от 4 июля 2017, 18:46
Mail Merge (https://wiki.documentfoundation.org/images/3/3c/WG4211-UsingMailMerge.pdf)?
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 4 июля 2017, 21:04
Mail Merge?

само циркулярное письмо пробовал - не годится. Так как наблюдаются сложности и "глюки". Во-первых, нужно настроить и обучить более 20пользователей предпенсионного возраста. Во- вторых, база редактируется "на лету" (хранится на сервере), а в циркулярном письме обновляется через 20-40 минут (новые записи появляются через 20-40 минут)! Мне бы хотелось все же воспользоваться макросом, т.к. он гибче
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 4 июля 2017, 21:21
Порылся на сайте, единственное, что нашел это
Цитироватьsub insTF
Rem Макрос написан Alexey7ov для 0xJah 25/12/13,
Rem стр.: http://forumooo.ru/index.php/topic,3844.0.html
dim i as integer
dim tdoc as object
dim usF as object
dim txtF(1) as object
dim tCursS as object
dim tCursE as object
dim tCurs as object
tdoc=thiscomponent
tCursS=tdoc.Text().getStart()
tCursE=tdoc.Text().getEnd()
usF=tdoc.createInstance("com.sun.star.text.fieldmaster.User") ' Создание в документе пользовательского поля
usF.Name="Al": usF.Content="Alexey7ov"
for i=0 to 1
  txtF(i)=tdoc.createInstance("com.sun.star.text.textfield.User")
  txtF(i).attachTextFieldMaster(usF) ' Создаёт ссылку на главное поле
  tCurs=iif(i=0,tCursS,tCursE)
  tdoc.Text.insertTextContent(tCurs,txtF(i),0)
next
end sub
, у Питоньяка примерно то же самое - создать текстовое поле. А мне нужно не создавая поля, измнеть usF.Content="Alexey7ov" на свой,  так как поле уже будет создано  :-\
Название: Re: Замена циркулярному письму
Отправлено: maksvlad от 5 июля 2017, 17:38
Если я правильно понял "ТЗ", то нужен обработчик шаблона?
Делал я что-то подобное при помощи связки python + sqlite + jinja2
Морда лица была в odb
Создавался шаблон в odt с триггерами а-ля {{ИМЯ_КОНТОРЫ}}, которые потом на основе базы данных менялись на ООО "Рога и Копыта"
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 5 июля 2017, 18:39
Цитата: maksvlad от  5 июля 2017, 15:38maksvlad
ТЗ, правильно поняли! НО, я ниразу не программист. Разобраться бы с Бейскик ОО сначала)))

maksvlad, Может быть будут рабочие примеры???
Название: Re: Замена циркулярному письму
Отправлено: maksvlad от 6 июля 2017, 10:36
Я сам далек от программирования и IT (ни по образованию, ни по профессии ни разу не программист).
Когда встал примерно такой вопрос как в топике, то бейсик оказался не сильно удобным инструментом, тем более, ограниченный ООо (LО)
Решение нашел через использование внешней базы данных (sqlite в моем случае, может быть любая другая), движка шаблонов jinja2 для расстановки данных в шаблон xml и связывающего это все хозяйство скрипта на python, который обеспечивал запрос данных из БД, обработку результатов в нужном формате для шаблонизатора, манипуляцию с файлами и архивами
Алгоритм работы примерно следующий:
1) В ЛО создается шаблон в виде файла в формате odt (odt-шаблон), в котором указываются соответствующие метки.
2) Из odt-шаблона создается копия, которая и будет в последующем фалом с результатом (odt-копия)
3) Их  odt-шаблона извлекается context.xml, последний и используется как шаблон для Jinja2
4) На следующем этапе Jinja шинкует данные по шаблону в файл xml, который будучи поименованным context.xml помещается в odt-копию (файлы OOo LO - это zip-архивы)
И мы имеем нужную нам версию документа

Для быстрой разработки "междумордия" (GUI) использовал BASE.

Поскольку делалось исключительно для себя, без цели распространения, то смысла выкладывать код не вижу, ибо комментарии там личные, а чистить (переписывать) мне их лень.
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 6 июля 2017, 11:02
maksvlad  Спасибо!  :beer:,
Компьютера в учреждении закрыты,  даже флешку так просто не вставишь,  не говоря об установке всяких jinja и прочего  :'( Есть только Орен офис и все.  Так что вопрос актуальный
Название: Re: Замена циркулярному письму
Отправлено: maksvlad от 6 июля 2017, 11:14
Если средствами ОпенОффис, Проще всего через поля слияния.
Сам пользу поля и связь с таблицами, условие и обработку данных (например формирование текста определенного содержания) можно делать в таблице (во всяком случае для меня так проще)
На форуме есть некто АКА "economist", из его постов следует, что он слияние пользует активно. Может быть согласится помочь :)
Кстати, в ЛО, если нажать на кнопку быстрой печати, то программа выведет запрос на использование данных по ссылкам в полях и выдаст таблицу с выбором вариантов. Это оказалось проще, чем циркулярное письмо (mail merge)
Название: Re: Замена циркулярному письму
Отправлено: economist от 6 июля 2017, 11:34
Цитата: dimmon777 от  4 июля 2017, 19:04само циркулярное письмо пробовал - не годится. Так как наблюдаются сложности и "глюки". Во-первых, нужно настроить и обучить более 20пользователей предпенсионного возраста. Во- вторых, база редактируется "на лету" (хранится на сервере), а в циркулярном письме обновляется через 20-40 минут (новые записи появляются через 20-40 минут)!

На самом деле Сервис - Рассылка писем - абсолютно годный, несложный для пенсионеров и неглючный вариант.  
Глюки связаны с тем, что механизм сталкивается с невалидным значением (вместо числа - текст) или со значением ошибки (например, в кач-ве БД используется Таблица (xls/ods), а в ячейке её - #N/A #Н/Д #ДЕЛ/0 итп.

Поэтому:
1) выбор БД - в сторону SQLite - правильный. В неё все хранится как есть, то есть как текст. У меня база данных 200 Мб обновляется по сети каждые 3-10 минут, от разных клиентов, без сервера (файловый режим).  

2) выбор БД в виде Эл. таблицы - требует внимания, и допустим на уровне маленького отдела, в одном кабинете

3) поля слияния во Writer - лучшее, что сделано в мире ПО. Они форматируются, переносятся, ищутся, проверяется орфография (здесь вру, но несильно).

4) механизм выборочного слияния, по Ctrl+Shift+F4 (или просто F4) - шедевр юзабельности. Научить жать Ctrl+F, находить нужную строку и жать кнопку Данные в поля - очень легко.

PS А в чем были глюки и сложности? Если с данными - так их надо готовить... Поясните.  
Название: Re: Замена циркулярному письму
Отправлено: maksvlad от 6 июля 2017, 11:42
Цитата: economist от  6 июля 2017, 11:34
1) выбор БД - в сторону SQLite - правильный. В неё все хранится как есть, то есть как текст. У меня база данных 200 Мб обновляется по сети каждые 3-10 минут, от разных клиентов, без сервера (файловый режим). 

Что значить обновляется по сети? У каждого клиента своя реплика? И как конфликты разрешаются?
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 6 июля 2017, 12:02
maksvlad, как писал выше,  циркулярное письмо не вариант.  Есть 20 пользователей - предпенсионного возраста,  работающие за копейки (т. е.  учеба про всякие циркулярные письма им не интересна). Сделал макрос,  в котором вводишь один из параметров - ИНН организации,  открывается Шаблон в котором меняются поля на нужные (найти - заменить,  писал выше).  Впринципе работа макроса устраивает. Но хотелось бы повторно этот макрос использовать,  так как поля уже поменяны,  а новые значения он не вставляет!
Название: Re: Замена циркулярному письму
Отправлено: economist от 6 июля 2017, 12:55
maksvlad - файл SQLite - базы один, лежит на сетевой шаре. Подключение - файловое, через сетевые диски или в манере \\fileserver\share\dbfile.sqlite  или \\ip-address\share\dbfile.sqlite   

Файл поддерживает 4 потока на чтение и 1 поток на запись, все что больше - уходит в регулируемый тайм-аут. У меня при ежечасных 20 чтениях от 20 пользователей - никто не жалуется, т.к. сама SQLite быстрая неимоверно. Таймауты на 10 секунд возникают единичные, в основном при записи кем-то. Саму базу читают до 100 человек, но отслеживать коннекты я после краштестов перестал, т.к. всё работает ровно. По скорости - равно MS Access 2003 при 5-10 юзверях.

Вся магия в "указателях" внутри файла БД, он не перезаписывается целиком никогда.

Конфликтов в SQLite не бывает, кто последний - тот и папа, ACID и Rollback - есть. 
Название: Re: Замена циркулярному письму
Отправлено: rami от 6 июля 2017, 12:59
Цитата: dimmon777 от  6 июля 2017, 10:02Впринципе работа макроса устраивает. Но хотелось бы повторно этот макрос использовать,  так как поля уже поменяны,  а новые значения он не вставляет!
Повторно этот макрос использовать не надо. Для изменения содержимого существующего поля пользователя (с именем "Al" как в предыдущем примере или другим существующим) используйте:
Sub main
Dim oUserField
oUserField=ThisComponent.TextFieldMasters.getByName("com.sun.star.text.fieldmaster.User.Al")
oUserField.Content="Новый Content"
End Sub
Название: Re: Замена циркулярному письму
Отправлено: economist от 6 июля 2017, 13:14
dimmon777 - "циркулярка" нужна не всегда, поясню. Вот как работает у меня:

Для нескольких писем конкретным адресатам:

1) Пользователь запускает Writer и выбирает из шаблона, а чаще просто в пустом листе набирает 2-3 буквы - фб (фирменный бланк), пж (письмо-жалоба), пз (претензия по задолженности), дп (договор поставки) и жмет F3. Появляется готовый документ с "серыми" полями из БД. В письме-претензии - это порядка 10 полей, в договоре - 20.

2) Пользователь жмет Ctrl+Shift+F4 (открывается таблица СУБД - результат запроса, содержащая всё, что может понадобиться в жизни - адреса, фио и ДР рук-ей, номера доверенности, суммы задолженности, лимит её, среднемесячный оборот, количество просрочек, колонку прайса итп),

3) Пользователь жмет Ctrl+F вводит "хвост" ИНН (5-6 цифр) и Enter. Курсор находит нужную строку.

4) Пользователь жмет кнопку Данные - в поля. Всё, документ готов к печати


Для тысячи писем - всем из таблицы "Должники с просрочкой свыше 100000 и 3-х мес":
...
3) Сервис - Рассылка - Далее (4 раза). Всё, получен один 1000 страничный или 1000 одностраничных ODT/DOC/PDF-файлов, с помощью расширения MultiSave.  

Обучаются этой системе за 2-3 часа. Макросов здесь нет, а если и есть - копеечные. Например тут, когда нужна "обратная связь" - файла ODT -> ODB -> ODBC -> SQLite -> ODB -> другой ODT. Скажем, у меня человек пишет заявление на матпомощь во Writer, тратит 1 минуту (там списки, чекбоксы, автодиагностика - положена она ему или нет) - данные из него сразу попадают в SQLite, её отчеты, и вот они: в любой момент готовые Протоколы профкома, Реестр на выдачу, Платежная ведомость. Красота...
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 6 июля 2017, 20:32
rami Спасибо, как всегда на высоте, буду использовать! ;D
Название: Re: Замена циркулярному письму
Отправлено: economist от 7 июля 2017, 10:51
В пользу стандартной Рассылки во Writer - ещё пара доводов:

Помимо прочего, Рассылка может сразу рассылать по e-mail те самые "циркулярные" письма, по спискам рассылки.

Список рассылки (он же база данных для слияния) - это или Таблица БД, или Представление таблицы (виртуальная, VIEW) или "вырезка" из них, результат простейшего SQL-запроса с условием, которые настолько удобно создаются и правятся в Base, что у меня этому научились почти все вменяемые "значкисты" - красивейшие представительницы планктона со средней ЗП 40 т. руб. (6 из 36).

Скажем директор сказал: срочно отправить "от 100 тыс. руб. и более - должникам N-ской области" - тревожное "письмо шастья", что вот-вот передадим дело в арбитраж и насчитаем проценты, хоть никогда этого не делали.

Обычный бух открывает Writer - Ctrl+Shift+F4 и видит в таблице Должники - около 500 строк, большую часть - лишних.

Щелк ПКМ на Таблице - Редактировать базу... Открылся Base - Создать запрос. Далее пишется "речевка", которую 70 человек знают по аттестации: чтобы ввести шаблон SQL-запроса - надо ввести SQLT. Появится
SELECT * FROM Таблица
WHERE Поле1 Like '%что-то%'  

Бух исправляет "заготовку" на очевидное

SELECT * FROM Должники WHERE Задолженность>=100000 AND Регион="N-ская"

Выполняет (F5) и видит готовый список рассылки на 15 строк. Сама Рассылка займет еще пару минут.

Всего времени ушло минут пять. За это время даже просто написать в техподдержку или дозвониться до неё нереально, а то что нужно ждать результата минимум час (де факто - сутки) - я молчу.

Быстрая Рассылка по SQL-запросу "с параметром" или "само-поправленному" (почти нулевым знаниями SQL бухом), - это даже не выбор "шашечки или ехать" - это всегда "лететь со скоростью пули", которая да, делается из бесплатного и свободного ПО. Так и должен лететь бизнес. Иначе - сожрут...  
Название: Re: Замена циркулярному письму
Отправлено: maksvlad от 7 июля 2017, 12:27
economist, смотрю я на эти все советы по разным темам и прихожу к выводу, что пора писать коллективный "howto" по различным способам слияния, рассылки и использования полей
Кстати, а база данных как наполняется, точней какое "междумордие" используется?
Название: Re: Замена циркулярному письму
Отправлено: economist от 7 июля 2017, 16:17
maksvlad - база наполняется из разных баз 1С (7/8) - парсингом их отчетов в виде TXT-файлов (Tab - разделитель, слава Богу что он был кем-то придуман) - консольными скриптами на языке Python, поскольку после недели тестов в работе оказалось что:
- в 10 раз Python быстрее чем VBS
- в 4 раза Python быстрее чем StarBasic
- в 2 раза Python быстрее чем VBA  

Интересна также статистика написания кода. Один и тот же "парсер TXT-укладыватель в SQLite" - был написан мною, не подглядывая в код другой реализации на другом ЯП:
- за 4 часа на VBA  
- за 6 часов на Python
- за 40+ часов на StarBasic (и так не дописан, потому что я сдался: влюбиться в SB я так и не смог ~8|)


Причина ошеломительного успеха змеюки - мощная стандартная библиотека Python, + библа re, + библа codecs - решение всех проблем с кодировками файлов.
Ну что может быть проще чем:

f = codecs.open(txtFile, 'r', "windows-1251")

Когда запилят отладку в IDE OpenOffice|LibreOffice для языка Python - мы увидим офисный пакет в самых неожиданных местах - то есть везде. Могу продать идею... Microsoft-у, но не буду. На их ПО мы потратили денег больше, чем на всё железо, и этих миллионов мне жалко.

Мдя..я, пятнично вышло...
Название: Re: Замена циркулярному письму
Отправлено: maksvlad от 7 июля 2017, 18:34
economist, спасибо за такой обстоятельный ответ :)
Статистика очень интересна.
Python - это хорошая палочка-выручалочка
Ну и с пятницей :)
Название: Re: Замена циркулярному письму
Отправлено: dimmon777 от 10 июля 2017, 21:37
Чем мне ЦП не нравится: 1- медленное обновление БД (особенно если в сети, и обновляется много времени), доходит до часа. 2- Если формируется более 2000 писем в рассылке, то наблюдаются неимоверные лаги и подвисания (сбой стилей страниц, может рассылка формироваться из 6000 писем несколько часов!). 3- Отсюда, конечный файл будет неимоверных размеров. 4- Само поле должно содержать не более столки-то символов, т.е. параграф из нескольких редложений не вставишь. (особенно в Word'e - пару строк и только). Это только с чем я столкунлся в последнее время...
Так что постепенно отхожу от ЦП. Для себя выделил несколько плюсов: 1 - Через макросы можно получить результат быстрее, 2 - сразу можно выводить на печать хоть 20 тысяч писем (без формирования конечного файла), если несколько принтеров, то можно экземпляры раскидывать по ним. 3- Настраиваемость. Например настроил, что бы почтовые реестры формировались и печатались сами, после 40 отпечатанных писем, таким образом, в дальнейшем не нужно рассортировывать.
Название: Re: Замена циркулярному письму
Отправлено: economist от 11 июля 2017, 12:54
Делал сам ЦП на 1,2 тыс. писем, работало приемлемо, но на 6 тыс. - согласен, лучше макрос. А еще лучше - написать расширение вроде FastMailMerge, только работающее.