|
|
|
Как написать генератор Word-файлов, с одинаковой структурой и разными данными
|
|||
|---|---|---|---|
|
#18+
Всем привет! Стоит задача генерировать документацию (конечные файлы достаточно большие и сложные). Будет много разных документов одинаковой структуры. Некоторые куски текста будут одинаковые во всех документах. Но вот данные, которыми заполняются таблицы в документах, а также некоторый текст внутри отдельных глав будет отличаться. Генерация может быть как в doc, так и в rtf формате. Соответственно, вопрос: подскажите, пожалуйста, как лучше всего генерировать одинаковые по структуре, но разные по данным документы? У меня есть кое-какие соображения. Первое, что приходит в голову — составить шаблон документа, в котором вместо динамических данных — макросы. Генератор документов получает на вход xml-документ с данными, затем открывает doc-файл, идет по нему, находит макрос, и вместо него подставляет данные из xml-файла. Генератор использует COM-технологию для сканирования объектов. Например: Word-документ шаблона: $Title$ documentation Authors: $foreach authors$ FIO: $author$ $end foreach$ xml, который передается: автор<Title>Test</Title> <authors> <author>Petrov A I</author> <author>Ivanov E E</author> </authors> В результате генерации мы должны получить: Test documentation Authors: FIO: Petrov A I FIO: Ivanov E E В результате разных xml-ей мы и получим одинаковые по структуре, но разные по данным документы, как и нужно. Что не нравится в этом подходе: нужно писать парсер на COM, который будет ходить по doc-шаблону, разбирать макросы, понимать, где циклы начинаются, где заканчиваются — сложно это... Что хорошо: есть визуальный шаблон, и пользователь сразу видит, как примерно будет выглядеть конечный документ. Второй подход: использовать обычную xslt-трансформацию, где куски отформатированного текста забиты прям в xsl-шаблон. Огромный недостаток здесь — xsl очень ненаглядный, что недопустимо, так как есть требование, чтобы некоторые пользователи могли сами править шаблоны. Учить xsl-преобразованию для этого их недопустимо! Может, есть более простое и гибкое решешие генерации одинаковых по структуре документов, чем первое решение, предложенное мной?ло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2010, 18:46 |
|
||
|
Как написать генератор Word-файлов, с одинаковой структурой и разными данными
|
|||
|---|---|---|---|
|
#18+
Vetal, если не нужно менять форматирование внутри "динамических" данных, то можно обойтись методом Execute вордовского объекта Find . Проще, но менее гибко. Например:Шаблон Word-документа: ~1~ documentation Authors: FIO: ~2~ FIO: ~3~ "словарь", который передается: 1=Test 2=Petrov A I 3=Ivanov E E Псевдо-код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Test documentation Authors: FIO: Petrov A I FIO: Ivanov E E ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2010, 21:07 |
|
||
|
Как написать генератор Word-файлов, с одинаковой структурой и разными данными
|
|||
|---|---|---|---|
|
#18+
Забавно.. Недавно отказался от такого решения задачи в пользу Exel =) У меня в программе (на Delphi) из базы данных генерировались отчетные формы (в том числе и таблицы), и выводилось все в Word. Реализовал, как и сказано было при помощи метода find. Создал шаблон, понаставил "статичных данных" - тегов вида <моя_переменная> и потом заменял их методом replace. Но на сравнительно больших данных (более 2000 записей, которых необходимо заменить) такая штука начинает работать довольно медленно. Поэтому я решил отказаться от такого метода, и попробовать генерировать в Exel таблицу с моими данными, а уже с помощью VBA создавать отчеты прямо в Exel, без метода find. Но тоже возникли сложности в реализации =) Поэтому, сейчас создам тему на форуме по созданию шаблонов в Exel =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2010, 09:23 |
|
||
|
Как написать генератор Word-файлов, с одинаковой структурой и разными данными
|
|||
|---|---|---|---|
|
#18+
Пробуй камнемVetal, если не нужно менять форматирование внутри "динамических" данных, то можно обойтись методом Execute вордовского объекта Find . Проще, но менее гибко. Хороший вариант, если бы у меня были только обычные пары значений, но у меня есть списки объектов. То-есть, в каждом элементе списка может быть целый набор полей. То-бишь, следующий вариант: <Title>Test</Title> <authors> <author><title>Doctor</title><name>Petrov A I</name></author> <author><title>Professor</title><name>Ivanov E E</name></author> </authors> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2010, 13:36 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=36670427&tid=2178025]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
182ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 499ms |

| 0 / 0 |
