Docvariable в word как пользоваться
Доброго времени суток!
Я бы хотел поднять скорее идейный вопрос: Как правильно заполнять шаблон Word?
Я знаю как минимум 5 способов заполнения Word шаблона, и все 4 имеют свои недостатки, пятый же настолько ужасен, что я его даже приводить не буду. Но крови он мне попил изрядно, т.к. приходится работать с чужим кодом. И так, давайте я перечислю то что знаю и плюсы и минусы этих подходов, а вы может быть подкините ещё способов для размышления, а может быть даже посоветуете единственно верный! Думаю тема будет многим полезна.
Описываю всё по русской версии Word.
1. DocVariable
Можно вставлять в шаблон поля с типом DocVariable, давать им имена, а потом в коде обращаться к ним примерно так:
В конце надо обязательно вызвать WordDoc.Fields.Update();
Плюсы: можно включить или выключить (Alt+F9) отображение этих переменных в шаблоне. Имена переменных видны прямо в шаблоне. Можно в разные места вставлять одну и ту же переменную.
Минусы: если вдруг по какой-причине вы не присвоили в коде значение такой переменной, то в результате в документе на месте переменной будет красоваться такая ошибка: "Ошибка! Переменная документа не указана."
2-3 FormText или Bookmarks
Эти 2 способа я объединю, т.к. они по сути одинаковы и второй полностью перекрывает третий.
Второй и опишу. В шаблон вставляется Поле FORMTEXT, ему присваивается Закладка, по которой мы и будет обращаться к полю в коде. Примерно так:
Ну и тоже самое с закладками, т.е. можно вставить в документ Закладку и почти так же к ней обращаться, только закладки не видны в Шаблоне в отличии от FormText, что не очень удобно.
Плюсы: в Шаблоне видны места вставок их отображение можно включать и отключать (Alt+F9). Если в коде мы ей ничего не присваиваем, ничего не происходит.
Минусы: что бы увидеть имя Закладки, нужно лезть в свойства Поля. Одно и тоже Поле (т.е. с одинаковой Закладкой) нельзя использовать в разных местах.
4. Replace Text
Можно из кода воссоздать вызов всем знакомой функции "Найти и заменить". В коде это всё выглядит немного громоздко, благо один раз метод написали и забыли. Но суть следующая. В Word вставляются текстовые "метки", т.е. такие сочетания, которые вы будете искать в коде и заменять. Кто-то используется для меток угловые скобки, кто-то фигурные. Не суть, главное что бы метки уникальной выделялись из текста. Т.е. вы можете вставить в документ такую метку , а в коде искать текст "" и заменять на то, что вам надо.
Плюсы: в Шаблоне явно видны как сами метки, так их имена. Можно использовать одну и ту же метку в разных местах. Если вы из кода попытаете заменить не существующую метку, ничего не произойдёт. В предыдущих случаях этот момент идёт в минус, т.к. попытка обратиться к не существующему полю вызовет ошибку, но минус так себе, поэтому я его там и не указал.
Минусы: если в коде вы по какой-то причине пропустили какую либо метку, она очень не красиво будет смотреться в результирующем документе. Сам подход архитектурно кривоват, т.е. какие-то сепец. символы для выделения меток, да и после замены какой-либо метки вы уже ничего не можете с ней сделать в Шаблоне, что тоже не очень хорошо.
А какой способ используете вы и почему? Может быть я не правильно использую какой-либо из вышеперечисленных способов и можно исключить перечисленные в нём минусы? Я лично пользуюсь первым способом, т.к. его единственный минус наиболее безобидный на мой взгляд.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Одна переменная документа. Если объект сериализуется как XML, его полное имя — В:доквар.
Комментарии
[ISO/IEC 29500-1 1 издание]
Доквар (односторонняя переменная документа)
Этот элемент задает параметры одной переменной документа. Переменная документа — это место хранения для произвольных данных клиента в парах имя/значение, которые хранятся в заданном документе WordprocessingML. В частности, этот элемент определяет с помощью атрибутов Name и Val имя и значение для заданной переменной документа.
[Примечание: этот механизм поддерживается только для совместимости с прежними версиями, и его следует избегать в пользу поддержки НАСТРАИВАЕМЫХ XML-данных, определенных в/ИЕК 29500. заметка]
[Пример: рассмотрим следующий фрагмент WordprocessingML, указывающий Пример документа вариабленамед и содержащий значение примераValue:
Элемент Доквар определяет одну переменную документа, с именем example , используя атрибут Name, и присвоено значение примера значения с помощью атрибута Val. конец примера
Родительские элементы |
---|
Докварс (§ 17.15.1.32) |
[Примечание: определение XML-схемы W3C для модели содержимого этого элемента (CT_DocVar) находится в разделе § A. 1. заметка]
Конструкторы
Инициализирует новый экземпляр класса Документвариабле.
Свойства
Получает все детские узлы текущего элемента.
Получает все расширенные атрибуты (атрибуты, не определенные в схеме) текущего элемента.
Получает первого ребенка элемента OpenXmlElement. Возвращает null (Ничего в Visual Basic), если нет такого элемента OpenXmlElement.
Получает значение boolean, которое указывает, имеет ли текущий элемент какие-либо атрибуты.
Получает значение, которое указывает, есть ли в текущем элементе какие-либо детские элементы.
Получает одновременное значение узла и всех его детей.
Получает или задает разметку, которая представляет только детские элементы текущего элемента.
Получает последний ребенок элемента OpenXmlElement. Возвращает null (Ничего в Visual Basic), если нет такого элемента OpenXmlElement.
Получает локальное имя элемента.
Задает атрибуты совместимости разметки. Возвращает null, если для текущего элемента не определены атрибуты совместимости разметки.
Имя переменной документа. представляет следующий атрибут в схеме: в:наме
Получает все объявления пространства имен, определенные в текущем элементе. Возвращает пустой переуметор, если нет объявления пространства имен.
Получает URI пространства имен текущего элемента.
Получает OpenXmlEementContext текущего элемента.
Получает разметку, представляюную текущий элемент и все его детские элементы.
Получает родительский элемент текущего элемента.
Получает префикс пространства имен текущего элемента.
Значение переменной документа. представляет следующий атрибут в схеме: в:вал
Получает квалифицированное имя текущего элемента.
Получает квалифицированное имя текущего элемента.
Методы
Добавляет объект в список аннотаций текущего элемента OpenXmlElement.
Добавляет объявление имен в текущий узел.
В этом переумехе ого задают все предки текущего элемента.
В нем указаны только предки текущего элемента, которые имеют указанный тип.
Получите первый объект аннотации указанного типа из текущего элемента OpenXmlElement.
Получите первый объект аннотации указанного типа из текущего элемента OpenXmlElement.
Получает коллекцию аннотаций с указанным типом для текущего элемента OpenXmlElement.
Получает коллекцию аннотаций с указанным типом для текущего элемента OpenXmlElement.
Придает каждый элемент из списка элементов в конец списка детских элементов текущего элемента.
Придает каждый элемент из массива элементов в конец списка детских элементов текущего элемента.
Придает указанный элемент в конец списка детских узлов текущего элемента.
Очищает все атрибуты, включая как известные атрибуты, так и расширенные атрибуты.
Создает дубликат текущего узла.
Создает дубликат этого узла.
В этом переумехе ого задают все потомки текущего элемента.
Введите все потомки текущего элемента типа T.
В этом переумехе 1000 000 000 000 000 000 000 000 00
В нем указаны только дети текущего элемента, которые имеют указанный тип.
В ней следуют все элементы, которые следуют текущему элементу, и у них один и тот же родитель, что и текущий элемент.
В этой области дается переумека всех элементов, предшествующих текущему элементу, и у них один родитель, как и текущий элемент.
Получает атрибут Open XML с указанным именем тега и пространством имен URI.
Получает список, содержащий копию всех атрибутов.
Возвращает итератор, который итерирует через детскую коллекцию.
Находит первый элемент ребенка в типе T.
Вставляет указанный элемент сразу после указанного эталонного элемента.
Вставляет указанный элемент сразу после текущего элемента.
Вставляет указанный элемент в указанный индекс в списке детских элементов текущего элемента.
Вставляет указанный элемент непосредственно перед указанным эталонным элементом.
Вставляет указанный элемент непосредственно перед текущим элементом.
Определяет, появится ли текущий элемент после указанного элемента в порядке документа.
Определяет, отображается ли текущий элемент перед указанным элементом в порядке документа.
Устраняет префикс пространства имен в контексте текущего узла.
Находит соответствующий префикс для пространства имен uri в текущем элементе области.
Получает элемент OpenXmlElement, который немедленно следует текущему элементу OpenXmlElement. Возвращает null (Ничего в Visual Basic), если нет следующего элемента OpenXmlElement.
Получает элемент OpenXmlElement с указанным типом, который следует текущему элементу OpenXmlElement. Возвращает null (Ничего в Visual Basic), если нет следующего OpenXmlElement.
Вставляет указанный элемент в начале списка детских элементов текущего элемента.
Получает элемент OpenXmlElement, который сразу же предшествует текущему элементу OpenXmlElement. Возвращает null (Ничего в Visual Basic), если нет предыдущего элемента OpenXmlElement.
Получает элемент OpenXmlElement с указанным типом, предшествующим текущему OpenXmlElement. Возвращает null (Ничего в Visual Basic), если нет предыдущего элемента OpenXmlElement.
Удаляет текущий элемент из родительского элемента.
Удаляет все детские элементы текущего элемента.
Удалите все детские элементы текущего элемента, которые имеют тип T.
Удаляет аннотации указанного типа из текущего элемента OpenXmlElement.
Удаляет аннотации с указанным типом из текущего элемента OpenXmlElement.
Удаляет атрибут из текущего элемента.
Удаляет указанный детский элемент из списка детских элементов текущего элемента.
Удаляет объявление пространства имен для указанного префикса. Ничего не удаляет, если нет префикса.
Заменяет детский элемент другим детским элементом в списке детских элементов текущего элемента.
Задает атрибут указанному элементу. Если атрибут является известным атрибутом, значение атрибута установлено. Если атрибут является расширенным атрибутом, в расширенный список атрибутов добавляется "openxmlAttribute".
Задает элементу несколько атрибутов. Если атрибут является известным атрибутом, значение атрибута устанавливается. Если атрибут является расширенным атрибутом, в расширенный список атрибутов добавляется "openxmlAttribute".
Публикация - своего р ода памятка, содержащая примеры кода для:
1. заполнение шаблона Word данными из 1С;
2. заполнение колонтитулов Word данными из 1С;
3. заполнение таблицы в Word данными из 1С;
Начало работы
В большинстве случаев перед нами ставится следующая задача:
Нужно открыть документ Word, заполненный данными из 1С.
Для этого нам нужно подготовить шаблон документа Word. Не путайте это с Word Template, специальные файлы Word, которые содержат настройки документов для многократного использования. Нам нужен обычный вордовский документ с расширениеми *.docx или *.doc. А далее поместить этот документ в макет с двоичными данными.
Читатель может справедливо заметить, что используется модальный вызов, и погрозить автору пальцем. И будет прав.
Далее я обычно создаю структуру полей, которые будут заполняться в шаблоне. Такой подход позволяет унифицировать процедуру заполнения шаблона, а также упростить последующее его изменение.
Углубимся немножко в принципы работы Word.
Каждый документ Word разделен на разделы, которые состоят из страниц.
Для каждого раздела есть возможность создавать свою нумерацию элементов, уникальные колонтитулы и настройки параметров страницы. Так, например, чтобы повернуть одну из страниц (вывести на печать как альбомную), нужно создать под неё отдельный раздел.
Каждая страница Word разделена на несколько областей:
- Верхний колонтитул
- Основной текст
- Нижний колонтитул
Нужно заметить, что в каждом разделе может быть уникальный колонтитул для первой страницы.
Заполнение пользовательских параметров
При обращении к этим коллекциям мы можем выполнять в них поиск и получать встроенные объекты, например, таблицы.
Теперь мы более-менее поняли, как обращаться к областям Word, можем в них пошуровать и выполнить замену наших параметров:
Рассмотри подробнее метод Execute. Его параметры идентичны диалоговуму окну при замене/поиске непоседресвенно из MS Word:
А вот и основные параметры (вольный перевод справки MSDN):
- Искомый текст - Строка - Текст для замены. Текст может содержать специальные параметры. Например, ^p - абзац, ^t - табуляция
- Чувствительность к регистру - Булево - Если истина, то поиск будет осуществляться с учетом регистра
- Слова целиком - Булево - Если истина, то ищутся слова целиком. Вхождение слов не учитываются. Например, при поиске слова дом будет пропущено слово домашний
- Использовать подстановочные знаки - Булево - Если истина, то используются встроенные регулярные выражения.
- Искать похожие - Булево - Если истина, то результат поиска будет содержать похожие слова
- Искать все формы - Булево - Если истина, то результат поиска будет содержать различные формы слов.
- Поиск сначала - Булево - Если истина, то будет осуществляться с начала до конца документа
- Охват - WdFindWrap - Опредяляет направление поиска
- Формат - Format - Формат искомого текста
- Строка замены - Строка - Строка, на которую будет заменен исходный текст
- Количество замен - WdReplace - Определяет сколько раз выполнять замену
- и т.д.
WdReplace - Constant Value:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1
Данный метод не позволяет получить "Строка замены" как выделенную область, но он работает где-то в 10 раз медленнее. Для получения выделенной области можно воспользоваться немножко откорректированной типовой функцией:
Уже получив выделенную область можно отредактировать стиль текста, шрифт и т.д.
Также есть второй подход, использующий такой объект Word, как поля. Мне он не очень нравится, т.к. в больших документах, порядка 100 страниц, эти поля начинают глючить (исчезать, не подставлять нужные значения) и прочая ерунда. Ну по крайней мере в Word 2007. Но я его все равно приведу:
При подготовке шаблона в тело документа необходимо навставлять полей с типом DOCVARIABLE (можно вставлять горячими клавишими Ctrl+F9).
Доступ к таким полям можно получить следующим нехитрым образом:
Заполнение таблиц по шаблону
Итак, мы заполнили параметры в основном тексте документа, заменили параметры в колонтитулах, но у нас еще есть одна неприятность - нужно заполнить таблицу.
Подход, описанный ниже, годится только для таблиц с заранее известным форматом. Т.е. мы можем как угодно отформатировать таблицу и её строки изначально. Но потом изменять довольно-таки проблематично.
К таблицам можно получить доступ через области документа.
Далее, получив таблицу, мы работаем с ней по привычной схеме - строки, столбцы.
Для задания форматирования легче в шаблоне создать таблицу с пустой первой строкой, которую мы в последующем удалим.
Вот, в принципе, и все. Основные вопросы, возникающие при работе с Word, я постарался осветить. Надеюсь, данный обзор поможет вам в работе =)
Спасибо за советы и комментарии:
v3rter, monkbest
Критика только приветствуется. Чем больше замечаний, тем лучше будет гайд =)
Столкнулся с такой ситуацией. Есть документ word. В нём используется несколько сотен переменных типа docvariable, однако их заносили методом ctr+c ctr+v и в коллекции variables документа их нет. Подскажите, пожалуйста, способ как можно получить полный перечень используемых в документе переменных.
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
При печати документа из word появляются цифры в документе которых быть не должно
Здравствуйте, такая беда, наш юрист как то печатает документ, что вылазят вот такие неприятности.
При сохранении в PDF добавляются номера страниц, которых нет в документе
Кнопка "Удалить нумерацию страниц" неактивна, но в док-файле нумерации и нет. Никаких галочек на.
Как выделить текст в документе word
Пытаюсь выделить текст в документе word. Выдает ошибку. Подскажите как от нее избавиться? var .
Как заименовать таблицу в документе Word?
Как таблице присвоить некоторое имя по которому ее можно будет искать в документе? И что бы оно.
Благодарю за замечание. Действительно, по текстовому описанию проблему довольно сложно представить. Оригинальный документ выложить не могу, воспроизвёл ситуацию в пустом документе.
В примере использовано 6 ссылок на разные переменные. Только первые две из них созданы командой ActiveDocument.Variables.Add, и они есть в коллекции Variables. Остальные были просто вставлены в самом файле word при помощи Ctr+F9 и таких вставок в оригинальном документе несколько сотен.
сам файл пустой, в коде ничего нет, так как файл с расширением docx, а должен быть с другим.В этом файле нет кода на VBA. Переменные DocVariables (Вставка - Поле. ) - это не макросы. Посмотреть их можно по Alt + F9. Скачал, посмотрел. Всё нормально. Все вставки вида на своих местах.
Добавил небольшой скрипт для вывода списка переменных в коллекции.
Для того чтобы воспроизвести в примере ситуацию, когда одна часть переменных содержится в коллекции Variables, а другая нет использовал внешний скрипт, который добавляет переменную этой командой. Просто для демонстрации разницы небольшой скрипт, написанный на коленке. Приложу, для наглядности.
Но суть проблемы всё-таки не в этом. В оригинальном документе (без макросов) содержится огромное количество таких вот переменных (полей типа Docvariables), которые нужно заполнить, но нет их полного перечня. Было бы здорово, если к этим переменным можно было обращаться через коллекцию variables. И вроде бы заполнять их значения так можно, но без полного списка непонятно как выполнить их полный перебор.
Решение
мистика, в приложенном файле в посте 3 ни Альтом+Эф9 ни кодом из поста 8 ничего не увидеть.Как найти слово в документе Word
Народ Подскажите плиз как можно в документе Word отыскать слово и скажем заменить его другим или.
Как в документе Word перемешать список
Привет народ . Прошу помощи , так-как с подобной задачей ещё не сталкивался. В общих чертах.
Как определить пустую страницу в документе Word
Имеется набор документов .txt, после преобразования их в один документ .doc (кодировка MSDOS.
Как сохранить текст в документе Word (doc)?
У меня есть некоторый текст, а также переменные которые требуется сохранить в вордовском.
Читайте также: