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

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

01.07.2016, 18:47. Показов 9542. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2016, 18:47
Ответы с готовыми решениями:

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

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

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

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

5
Эксперт .NET
11069 / 6986 / 1571
Регистрация: 25.05.2015
Сообщений: 21,072
Записей в блоге: 14
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
Цитата Сообщение от Predatore Посмотреть сообщение
Мда... пытаясь решить проблему не заполненных переменных в первом подходе, обнаружил ещё один существенный его недостаток.
Решать его надо по другому. Как говорил один умный человек: "Не получается толкать, попробуй тянуть. Или наоборот". Я хотел в конце не проинициализированные переменные проинициализировать пробелом, но раз с этим такие проблемы, то нужно всего лишь навсего проинициализировать пробелом ВСЕ переменные в начале. А это делается элементарно просто.
0
05.07.2016, 17:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2016, 17:24
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru