28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261
|
|||||||||||
Заполняем шаблон Word правильно01.07.2016, 18:47. Показов 9789. Ответов 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 данных
|
![]() ![]() |
|
01.07.2016, 19:18 | |
Вставляю закладку с именем типа data_node1_node2_node3. С текстом по умолчанию внутри, чтобы было видно расположение.
В программе открываю документ, собираю список всех закладок. Перебираю их. Имя закладки привожу к виду /data/node1/node2/node3, вытаскиваю данных из поданного на вход xml документа, записываю в документ. Все, не найденные в xml, можно либо удалить, либо оставить на месте.
0
|
![]() 1082 / 912 / 213
Регистрация: 29.09.2015
Сообщений: 1,015
|
|
01.07.2016, 19:28 | |
Я использую 4 вариант. Приходилось в метках генерировать и заполнять необъятные таблицы. Такой подход понравился, что стиль текста наследовался от стиля метки. И в зависимости от метки, соответственно будет меняться стиль всего что за ним лепится
0
|
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
|
|
01.07.2016, 20:01 | |
Тоже использовал 4 подход. В коде нужно только заменить текст, а в шаблоне можно уже настраивать стиль текста, что очень удобно. Плюс можно модифицировать сам шаблон как угодно, т.е. убирать-добавлять метки, при определённом подходе перекомпиляция даже не понадобится( я использовал экселевский файл, в котором содержались помимо данных метаданные, в которых были указаны соответствующие метки в вордовском).
0
|
28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261
|
|
04.07.2016, 14:41 [ТС] | |
Мда... пытаясь решить проблему не заполненных переменных в первом подходе, обнаружил ещё один существенный его недостаток. Дело в том, что коллекция переменных WordDoc.Variables включает в себя только те переменные, которым присвоены значения отличные от пусто. Т.е. в начале работы с шаблоном, эта коллекция вообще пустая и Count вернёт 0. Не понимаю зачем так сделано? При этом разными хитрыми способами всё-таки можно получить список переменных в шаблоне, но пользы от этого не много. Дело в том, что присвоить значение переменной мы можем, а вот прочитать её мы сможем только если присвоили что-то отличное от пусто. Если же там пусто, то при попытке обращения к свойству Value, мы получим ошибку, что такой объект не существует. А способов как узнать, присваивалось ли что-либо переменной или нет, я не нашёл. Ну разве что брать список всех переменных и сравнивать его со списком проинициализированных, что как-то не очень.
0
|
28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261
|
|
05.07.2016, 17:24 [ТС] | |
Решать его надо по другому. Как говорил один умный человек: "Не получается толкать, попробуй тянуть. Или наоборот". Я хотел в конце не проинициализированные переменные проинициализировать пробелом, но раз с этим такие проблемы, то нужно всего лишь навсего проинициализировать пробелом ВСЕ переменные в начале. А это делается элементарно просто.
0
|
05.07.2016, 17:24 | ||||||
Помогаю со студенческими работами здесь
6
Экспорт данных в шаблон Word Заполняем форму прокручиваемой информацией пример Word + Excel, Импорт данных из Excel в шаблон Word с условиями Word шаблон! Word и Delphi (шаблон) Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка:
«Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
|
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
|
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
|
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
|
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
|
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
|
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
|
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
|
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
|
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations
рестрикции доступа на сервер sshd
статья:
https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
подробные расшифровки по. . .
|