28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261
|
|||||||||||
1 | |||||||||||
Заполняем шаблон Word правильно01.07.2016, 18:47. Показов 9542. Ответов 5
Метки нет (Все метки)
Доброго времени суток!
Я бы хотел поднять скорее идейный вопрос: Как правильно заполнять шаблон Word? Я знаю как минимум 5 способов заполнения Word шаблона, и все 4 имеют свои недостатки, пятый же настолько ужасен, что я его даже приводить не буду. Но крови он мне попил изрядно, т.к. приходится работать с чужим кодом. И так, давайте я перечислю то что знаю и плюсы и минусы этих подходов, а вы может быть подкините ещё способов для размышления, а может быть даже посоветуете единственно верный! Думаю тема будет многим полезна. Описываю всё по русской версии Word. 1. DocVariable Можно вставлять в шаблон поля с типом DocVariable, давать им имена, а потом в коде обращаться к ним примерно так:
Плюсы: можно включить или выключить (Alt+F9) отображение этих переменных в шаблоне. Имена переменных видны прямо в шаблоне. Можно в разные места вставлять одну и ту же переменную. Минусы: если вдруг по какой-причине вы не присвоили в коде значение такой переменной, то в результате в документе на месте переменной будет красоваться такая ошибка: "Ошибка! Переменная документа не указана." 2-3 FormText или Bookmarks Эти 2 способа я объединю, т.к. они по сути одинаковы и второй полностью перекрывает третий. Второй и опишу. В шаблон вставляется Поле FORMTEXT, ему присваивается Закладка, по которой мы и будет обращаться к полю в коде. Примерно так:
Плюсы: в Шаблоне видны места вставок их отображение можно включать и отключать (Alt+F9). Если в коде мы ей ничего не присваиваем, ничего не происходит. Минусы: что бы увидеть имя Закладки, нужно лезть в свойства Поля. Одно и тоже Поле (т.е. с одинаковой Закладкой) нельзя использовать в разных местах. 4. Replace Text Можно из кода воссоздать вызов всем знакомой функции "Найти и заменить". В коде это всё выглядит немного громоздко, благо один раз метод написали и забыли. Но суть следующая. В Word вставляются текстовые "метки", т.е. такие сочетания, которые вы будете искать в коде и заменять. Кто-то используется для меток угловые скобки, кто-то фигурные... Не суть, главное что бы метки уникальной выделялись из текста. Т.е. вы можете вставить в документ такую метку {FieldName}, а в коде искать текст "{FieldName}" и заменять на то, что вам надо. Плюсы: в Шаблоне явно видны как сами метки, так их имена. Можно использовать одну и ту же метку в разных местах. Если вы из кода попытаете заменить не существующую метку, ничего не произойдёт. В предыдущих случаях этот момент идёт в минус, т.к. попытка обратиться к не существующему полю вызовет ошибку, но минус так себе, поэтому я его там и не указал. Минусы: если в коде вы по какой-то причине пропустили какую либо метку, она очень не красиво будет смотреться в результирующем документе. Сам подход архитектурно кривоват, т.е. какие-то сепец. символы для выделения меток, да и после замены какой-либо метки вы уже ничего не можете с ней сделать в Шаблоне, что тоже не очень хорошо. А какой способ используете вы и почему? Может быть я не правильно использую какой-либо из вышеперечисленных способов и можно исключить перечисленные в нём минусы? Я лично пользуюсь первым способом, т.к. его единственный минус наиболее безобидный на мой взгляд.
0
|
01.07.2016, 18:47 | |
Ответы с готовыми решениями:
5
Экспорт данных в шаблон Word Загрузка в шаблон MS WORD данных Вшить в программу шаблон word Экспорт данных в шаблон Word |
01.07.2016, 19:18 | 2 |
Вставляю закладку с именем типа data_node1_node2_node3. С текстом по умолчанию внутри, чтобы было видно расположение.
В программе открываю документ, собираю список всех закладок. Перебираю их. Имя закладки привожу к виду /data/node1/node2/node3, вытаскиваю данных из поданного на вход xml документа, записываю в документ. Все, не найденные в xml, можно либо удалить, либо оставить на месте.
0
|
1080 / 911 / 212
Регистрация: 29.09.2015
Сообщений: 1,014
|
|
01.07.2016, 19:28 | 3 |
Я использую 4 вариант. Приходилось в метках генерировать и заполнять необъятные таблицы. Такой подход понравился, что стиль текста наследовался от стиля метки. И в зависимости от метки, соответственно будет меняться стиль всего что за ним лепится
0
|
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
|
|
01.07.2016, 20:01 | 4 |
Тоже использовал 4 подход. В коде нужно только заменить текст, а в шаблоне можно уже настраивать стиль текста, что очень удобно. Плюс можно модифицировать сам шаблон как угодно, т.е. убирать-добавлять метки, при определённом подходе перекомпиляция даже не понадобится( я использовал экселевский файл, в котором содержались помимо данных метаданные, в которых были указаны соответствующие метки в вордовском).
0
|
28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261
|
|
04.07.2016, 14:41 [ТС] | 5 |
Мда... пытаясь решить проблему не заполненных переменных в первом подходе, обнаружил ещё один существенный его недостаток. Дело в том, что коллекция переменных WordDoc.Variables включает в себя только те переменные, которым присвоены значения отличные от пусто. Т.е. в начале работы с шаблоном, эта коллекция вообще пустая и Count вернёт 0. Не понимаю зачем так сделано? При этом разными хитрыми способами всё-таки можно получить список переменных в шаблоне, но пользы от этого не много. Дело в том, что присвоить значение переменной мы можем, а вот прочитать её мы сможем только если присвоили что-то отличное от пусто. Если же там пусто, то при попытке обращения к свойству Value, мы получим ошибку, что такой объект не существует. А способов как узнать, присваивалось ли что-либо переменной или нет, я не нашёл. Ну разве что брать список всех переменных и сравнивать его со списком проинициализированных, что как-то не очень.
0
|
28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261
|
|
05.07.2016, 17:24 [ТС] | 6 |
Решать его надо по другому. Как говорил один умный человек: "Не получается толкать, попробуй тянуть. Или наоборот". Я хотел в конце не проинициализированные переменные проинициализировать пробелом, но раз с этим такие проблемы, то нужно всего лишь навсего проинициализировать пробелом ВСЕ переменные в начале. А это делается элементарно просто.
0
|
05.07.2016, 17:24 | |
05.07.2016, 17:24 | |
Помогаю со студенческими работами здесь
6
Заполняем форму прокручиваемой информацией пример Word + Excel, Импорт данных из Excel в шаблон Word с условиями Word шаблон! Word и Delphi (шаблон) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |