Страница 1 из 5
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 20:41
RaFaeL
Есть необходимость генерировать из Клариона нечто, что потом можно просто так взять и открыть с редактированием в обычном Word. Как правило, это форма договора с разными приложениями-спецификациями. Какие варианты существуют? Начну с того, что уже знаю:
1) Экспорт по OLE. Сейчас используется механизм, при котором "рыба" создается пользователем в Word, затем в него из программы в нужные места передаются переменные. Тут не устраивает то, что у каждой переменной может быть только 1 значение и таким способом не передать таблицы с произвольным количеством строк. Возможно, стоит попробовать полное создание документа Word по OLE с нуля по структуре отчета.
Есть ли у кого-нибудь такой шаблон или класс?
2) Экспорт в векторный PDF и дальнейшая конвертация его в Word. Один из клиентов так делает онлайн-конвертером. Искал такие варианты. Онлайн-конвертеры с API все платные. Не нашел бесплатного, может кто знает? Также искал библиотеки которые можно прикрутить. Они есть! Например
https://www.investintech.com/purchase/developer/ но стоят блин...
3) Экспорт в rtf! Много для чего могло бы хватить!
Есть ли у кого-нибудь такой шаблон или класс?
4) Экспорт в HTML! Аналогично! Есть даже штатный (?) класс HTMLGenerator.
Им кто-то пользуется? Примеры?
5) Экспорт напрямую в docx! Не нашел библиотек!
6) Еще варианты???
Тут везде я имею в виду шаблоны и классы, когда у нас есть готовая структура Report и ее хочется в не сильно много строк кода перенести в обсуждаемый формат. Кто чем и как пользуется?
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 21:12
finsoftrz
Я в своем генераторе и Фомин в фрб используем вывод в rtf с фреймами. Но не совсем на основании report структуры. Точнее сказать, из некоего промежуточного хранилища динамически строится report или rtf, в зависимости от заданного режима. Надписи в фреймах потом можно редактировать в ворде или райтере. Это, конечно, имеет некоторые ограничения. Изменять положение фреймов крайне не удобно.
Был еще и в архивах этого форума шаблон вывода в rtf, цепляющийся к стандартной report процедуре. Тоже со своими ограниченими.
Для договоров я давно обхожусь без report. Есть такой старый генератор отчетов, который на основании шаблона в формате rtf с вставками ## и файла с данными, строит уже полноценный rtf без фреймов, с таблицами и т.п. Можно задавать аналоги наших детейл структур. Можно приделать дополнительный список формул, чтобы часть вычислений вынести за рамки программы. Я также пробовал делать класс, чтобы обойтись без временного файла с данными, но до конца не отладил, так как область применения инструмента касается только договоров. Кстати, бланки очень легко редактируют обычные пользователи. Обычный текст, в котором обозначаются вставки. Называется этот генератор reportRtf.
Если современно и молодежно, то docx, он аналогичен xlsx, даже проще. Я не делал. Может, у Валеры Будько что-то есть готовое и не жалко.
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 21:24
Игорь Столяров
RaFaeL писал(а): ↑12 Февраль 2020, 20:41
и таким способом не передать таблицы с произвольным количеством строк.
Элементарно. Шаблоны делать не умею, но могу объяснить принцип, если нужно …
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 22:55
RaFaeL
Игорь Столяров писал(а): ↑12 Февраль 2020, 21:24
Элементарно. Шаблоны делать не умею, но могу объяснить принцип, если нужно …
Расскажите, послушаю ) Только если это будет рассказ просто о том, как технически по OLE это сделать, так это и козе понятно. Вопрос в том, как такие переменные задать в Word, и чтобы адекватно, а не вот эти "##" с последующей тупой заменой текста
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 22:58
RaFaeL
finsoftrz писал(а): ↑12 Февраль 2020, 21:12
Я в своем генераторе и Фомин в фрб используем вывод в rtf с фреймами. Но не совсем на основании report структуры. Точнее сказать, из некоего промежуточного хранилища динамически строится report или rtf, в зависимости от заданного режима. Надписи в фреймах потом можно редактировать в ворде или райтере. Это, конечно, имеет некоторые ограничения. Изменять положение фреймов крайне не удобно.
Можно из структуры. Структура у нас есть, из нее делается экспорт в xlsx. Есть примеры?
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 23:17
finsoftrz
RaFaeL писал(а): ↑12 Февраль 2020, 22:55
Игорь Столяров писал(а): ↑12 Февраль 2020, 21:24
Элементарно. Шаблоны делать не умею, но могу объяснить принцип, если нужно …
Расскажите, послушаю ) Только если это будет рассказ просто о том, как технически по OLE это сделать, так это и козе понятно. Вопрос в том, как такие переменные задать в Word, и чтобы адекватно, а не вот эти "##" с последующей тупой заменой текста
Зря Вы так про #. Для договоров это отличный вариант. В решетках может быть имя динамически вычисляемой переменной. Решетки также используются для выделения отдельных секций (деталек), позволяющих организовать вывод многострочных частей. И при этом используется прямое формирование ртф, без всяких оле.
Пользователям удобнее готовить договора в ворде, а не в каких-то экзотических дизайнерах. Этим часто занимаются юристы, не работающие в нашей программе.
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 12 Февраль 2020, 23:21
finsoftrz
RaFaeL писал(а): ↑12 Февраль 2020, 22:58
finsoftrz писал(а): ↑12 Февраль 2020, 21:12
Я в своем генераторе и Фомин в фрб используем вывод в rtf с фреймами. Но не совсем на основании report структуры. Точнее сказать, из некоего промежуточного хранилища динамически строится report или rtf, в зависимости от заданного режима. Надписи в фреймах потом можно редактировать в ворде или райтере. Это, конечно, имеет некоторые ограничения. Изменять положение фреймов крайне не удобно.
Можно из структуры. Структура у нас есть, из нее делается экспорт в xlsx. Есть примеры?
Пример чего, сформированного ртф файла? Могу завтра прикрепить, если нужно. Открываете через блокнот и там все видно.
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 0:11
Игорь Столяров
RaFaeL писал(а): ↑12 Февраль 2020, 22:55
Вопрос в том, как такие переменные задать в Word
Возможно я не правильно понял задачу.
Как верно было замечено не мной - офисный пакет прекрасно подходит для заполнения пользователями готовых шаблонов,
но это могут быть не только одиночные поля, но и табличные структуры для счётов, накладных, спецификаций и т.д. без проблем.
Это работает лет пятнадцать, со времён Microsoft Office XP (был такой).
Поясните пожалуйста, что такое "переменные в Word", которые Вы хотите задать ?
Или Вы так называете поля для заполнения в шаблоне отчёта ?
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 0:15
Игорь Столяров
RaFaeL писал(а): ↑12 Февраль 2020, 20:41
таким способом не передать таблицы с произвольным количеством строк
RaFaeL писал(а): ↑12 Февраль 2020, 22:55
как технически по OLE это сделать, так это и козе понятно
Опять когнитивный диссонанс.
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 1:07
RaFaeL
Игорь Столяров писал(а): ↑13 Февраль 2020, 0:11
Поясните пожалуйста, что такое "переменные в Word", которые Вы хотите задать ?
Или Вы так называете поля для заполнения в шаблоне отчёта ?
Я имею в виду поля
https://docs.microsoft.com/ru-ru/archiv ... ord-2010-2
Если при вставке поля выбрать не предопределенное поле, а DocVariable, то можно добавить поле с любым именем и затем его заполнить по OLE. Вот это поле типа DocVariable я называю переменной (ну логично же).
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 1:14
RaFaeL
Игорь Столяров писал(а): ↑13 Февраль 2020, 0:11
Как верно было замечено не мной - офисный пакет прекрасно подходит для заполнения пользователями готовых шаблонов,
но это могут быть не только одиночные поля, но и табличные структуры для счётов, накладных, спецификаций и т.д. без проблем.
Это работает лет пятнадцать, со времён Microsoft Office XP (был такой).
Как вы эту таблицу опишете в Word? Может я чего-то не знаю
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 1:54
Admin
Что то типа такого
https://github.com/DocxFactory/DocxFactory поискать
И сделать враппер как на xlsxwriter
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 2:53
RaFaeL
Это я кстати смотрел пару лет назад. Штука интересная, но какого-то дикого размера (30 мб в развернутом виде, у меня все остальная программа столько) и с "нуля" не позволяет построить docx, только какое-то слияние. Т.е. это просто замена OLE в режиме работы с полями (переменными), не более того
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 5:41
Игорь Столяров
Игорь Столяров писал(а): ↑13 Февраль 2020, 0:15
Вот это поле типа DocVariable я называю переменной (ну логично же).
Я всегда за то, что бы не усложнять простое.
Предположим обычный пользователь, не знакомый с работами Татьяны Суровцевой, сам нарисовал в Microsoft Word
отчёт в том виде, как он его хочет видеть (или местный ботан ему помог). Получилось как в прикреплённом примере.
Как заменить одиночные поля - козе понятно
, нас интересует список. Открываем DOC(X), RTF, ODT и работаем через OLE.
Код: Выделить всё
! QSpisok - это произвольная QUEUE с записями для экспорта, WordObject - OLE с открытым документом.
Loc:AllRecord = Records(QSpisok) ! Кол-во записей для экспорта в табличную структуру
WordObject{'Selection.Find.ClearFormatting'} ! очистили ранее указанные параметры поиска
WordObject{'Selection.Find.Replacement.ClearFormatting'} ! очистили ранее указанные параметры замены
! ищем табличный блок и заменяем, по всему документу
If WordObject{'Application.Selection.Find.Execute("' & Clip('[T01]') & '", , , , , , 1, 1, , "' & Clip('[T01]') & '", 1)'}
Loop Loc:Count = 1 to Loc:AllRecord by 1
Get(QSpisok,Loc:Count)
WordObject{'Application.Selection.TypeText("' & QSpisok.Nomer & '")'}
WordObject{'Application.Selection.MoveRight(12)'}
WordObject{'Application.Selection.TypeText("' & QSpisok.Name & '")'}
WordObject{'Application.Selection.MoveRight(12)'}
WordObject{'Application.Selection.TypeText("' & Clip(Left(QSpisok.Kolvo)) & '")'}
WordObject{'Application.Selection.MoveRight(12)'}
WordObject{'Application.Selection.TypeText("' & QSpisok.Ed & '")'}
WordObject{'Application.Selection.MoveRight(12)'}
WordObject{'Application.Selection.TypeText("' & Clip(Left(QSpisok.Price)) & '")'}
WordObject{'Application.Selection.MoveRight(12)'}
WordObject{'Application.Selection.TypeText("' & Clip(Left(QSpisok.Summa)) & '")'}
If Loc:Count <> Loc:AllRecord then WordObject{'Application.Selection.MoveRight(12)'}.
end
end
Кратко поясню происходящее:
1. Находим поле табличного блока (и устанавливаем курсор в левую верхнюю ячейку таблицы);
2. Вставляем значение каждой колонки в текущую ячейку и "нажимаем клавишу" стрелка вправо.
3. При заполнении строки, Word сам добавляет новую строку и переходит на неё - поэтому после
последнего поля, последней записи - не делаем "нажатие клавиши" (иначе будет пустая, лишняя строка).
4. Всё. Таблица вставлена. Надеюсь, что излишне говорить о том, что пользователь сам может задать в шаблоне
нужные ему форматы, выравнивание, оформление, цвета и т.д. отдельно для каждой ячейки в таблице …
Экспорт отчетов в doc/docx или аналоги. Какие есть варианты?
Добавлено: 13 Февраль 2020, 9:01
finsoftrz
Вот из загашников reportRTF. В архиве много примеров с описанием. Есть сырцы на си и паскаль, при желании можно интегрировать в кларион, как некоторые любят.
Есть и готовый exe.
Я использую exe. Работа убрана в класс. Сделана еще развязка в виде динамических формул. Классу передается имя файла шаблона. Если рядом лежит файл с тем же именем и расширением txt, то класс автоматом подгружает из него формулы и вычисляет при формировании данных в нужных местах (секциях). В формулах доступно все, что ест evaluate.
Со стороны клариона у меня концепция единая для всех дизайнеров. Ее еще Фомин в FRB показал. Создается некая мастер-процедура, которая определяет правила для формирования определенного вида форм. К одной мастер-процедуре может быть отнесено множество форм. Содержимое конкретной формы (бланка) нашей программе не известно, только заданные правила.