Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/49: Рейтинг темы: голосов - 49, средняя оценка - 4.76
28 / 23 / 8
Регистрация: 25.10.2009
Сообщений: 261

Заполняем шаблон Word правильно

01.07.2016, 18:47. Показов 9789. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Я бы хотел поднять скорее идейный вопрос: Как правильно заполнять шаблон Word?
Я знаю как минимум 5 способов заполнения Word шаблона, и все 4 имеют свои недостатки, пятый же настолько ужасен, что я его даже приводить не буду. Но крови он мне попил изрядно, т.к. приходится работать с чужим кодом. И так, давайте я перечислю то что знаю и плюсы и минусы этих подходов, а вы может быть подкините ещё способов для размышления, а может быть даже посоветуете единственно верный! Думаю тема будет многим полезна.
Описываю всё по русской версии Word.

1. DocVariable
Можно вставлять в шаблон поля с типом DocVariable, давать им имена, а потом в коде обращаться к ним примерно так:
C# Скопировано
1
2
WordVar = WordDoc.Variables.Item(VarName);
WordVar.Value := value;
В конце надо обязательно вызвать WordDoc.Fields.Update();
Плюсы: можно включить или выключить (Alt+F9) отображение этих переменных в шаблоне. Имена переменных видны прямо в шаблоне. Можно в разные места вставлять одну и ту же переменную.
Минусы: если вдруг по какой-причине вы не присвоили в коде значение такой переменной, то в результате в документе на месте переменной будет красоваться такая ошибка: "Ошибка! Переменная документа не указана."

2-3 FormText или Bookmarks
Эти 2 способа я объединю, т.к. они по сути одинаковы и второй полностью перекрывает третий.
Второй и опишу. В шаблон вставляется Поле FORMTEXT, ему присваивается Закладка, по которой мы и будет обращаться к полю в коде. Примерно так:
C# Скопировано
1
2
WordFormField = WordDoc.FormFields.Item(FieldName);
WordFormField.Result = value;
Ну и тоже самое с закладками, т.е. можно вставить в документ Закладку и почти так же к ней обращаться, только закладки не видны в Шаблоне в отличии от FormText, что не очень удобно.
Плюсы: в Шаблоне видны места вставок их отображение можно включать и отключать (Alt+F9). Если в коде мы ей ничего не присваиваем, ничего не происходит.
Минусы: что бы увидеть имя Закладки, нужно лезть в свойства Поля. Одно и тоже Поле (т.е. с одинаковой Закладкой) нельзя использовать в разных местах.

4. Replace Text
Можно из кода воссоздать вызов всем знакомой функции "Найти и заменить". В коде это всё выглядит немного громоздко, благо один раз метод написали и забыли. Но суть следующая. В Word вставляются текстовые "метки", т.е. такие сочетания, которые вы будете искать в коде и заменять. Кто-то используется для меток угловые скобки, кто-то фигурные... Не суть, главное что бы метки уникальной выделялись из текста. Т.е. вы можете вставить в документ такую метку {FieldName}, а в коде искать текст "{FieldName}" и заменять на то, что вам надо.
Плюсы: в Шаблоне явно видны как сами метки, так их имена. Можно использовать одну и ту же метку в разных местах. Если вы из кода попытаете заменить не существующую метку, ничего не произойдёт. В предыдущих случаях этот момент идёт в минус, т.к. попытка обратиться к не существующему полю вызовет ошибку, но минус так себе, поэтому я его там и не указал.
Минусы: если в коде вы по какой-то причине пропустили какую либо метку, она очень не красиво будет смотреться в результирующем документе. Сам подход архитектурно кривоват, т.е. какие-то сепец. символы для выделения меток, да и после замены какой-либо метки вы уже ничего не можете с ней сделать в Шаблоне, что тоже не очень хорошо.

А какой способ используете вы и почему? Может быть я не правильно использую какой-либо из вышеперечисленных способов и можно исключить перечисленные в нём минусы? Я лично пользуюсь первым способом, т.к. его единственный минус наиболее безобидный на мой взгляд.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.07.2016, 18:47
Ответы с готовыми решениями:

Экспорт данных в шаблон Word
Приветствую форумчане! Помогите мне пожалуйста! Скоро защита диплома( На форме имеется textBox и comboBox и кнопка button. Я пытаюсь по...

Загрузка в шаблон MS WORD данных
Здравствуйте, проблема в следующем нужно в готовый шаблон MS WORD загрузить значения переменных, все работает кроме одной строки, возникает...

Вшить в программу шаблон word
Хочу вшить в свой проект готовый шаблон word (для удобства сотрудников, захотели посмотреть форму заявления на отгул к примеру открыли и...

5
Эксперт .NET
 Аватар для Rius
11421 / 7300 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
01.07.2016, 19:18
Вставляю закладку с именем типа data_node1_node2_node3. С текстом по умолчанию внутри, чтобы было видно расположение.
В программе открываю документ, собираю список всех закладок.
Перебираю их.
Имя закладки привожу к виду /data/node1/node2/node3, вытаскиваю данных из поданного на вход xml документа, записываю в документ.
Все, не найденные в xml, можно либо удалить, либо оставить на месте.
0
 Аватар для Sklifosofsky
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  [ТС]
Цитата Сообщение от Predatore Посмотреть сообщение
Мда... пытаясь решить проблему не заполненных переменных в первом подходе, обнаружил ещё один существенный его недостаток.
Решать его надо по другому. Как говорил один умный человек: "Не получается толкать, попробуй тянуть. Или наоборот". Я хотел в конце не проинициализированные переменные проинициализировать пробелом, но раз с этим такие проблемы, то нужно всего лишь навсего проинициализировать пробелом ВСЕ переменные в начале. А это делается элементарно просто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2016, 17:24
Помогаю со студенческими работами здесь

Экспорт данных в шаблон Word
Здравствуйте, подскажите как сформировать отчёт из С# в Word. Заранее спасибо =)

Заполняем форму прокручиваемой информацией пример
Друзья, всем привет ! Подскажите какой-нибудь урок, который реализует в программе использование такого объема текста, который не...

Word + Excel, Импорт данных из Excel в шаблон Word с условиями
Здравствуйте! Помогите, пожалуйста. Есть файл Word с расставленными закладками-метками и файл Excel с несколькими листами. С помощью...

Word шаблон!
Имеется MS Word шаблон (текст и таблица), как в определённое место вставить данные (Между имеющимся текстом, и в некоторые ячейки таблицы)?...

Word и Delphi (шаблон)
Добрый день Возник вопрос, есть код, который выводит хранимую процедуру по определенному вводимому значению из Delphi в документ Word ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
На любовном киберфронте
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 подробные расшифровки по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер