C заполнение шаблона word
Имеется база данных содержащая информацию об абонентах. Абонентам должны отсылаться бумажные письма. Тексты писем (шаблоны) готовят люди от ИТ очень далекие (юристы, маркетологи и прочие дармоеды), но умеющие пользоваться вордом в том или ином виде (иногда, даже очень хорошо). Т.е. объяснить им, как вставить ключевое слово в текст, вполне возможно, но более сложное требование вызовет у них когнитивный диссонанс.
Второй момент, есть необходимость некоторые письма перед печатью подвергать ручной проверке и правке при необходимости (UPD) и находится в одном файле (это связано, с механизмами их дальнейшей передачи). Т.е. в месте формирования они только готовятся (и иногда печатаются).
Казалось, что задача проста как три копейки: берем шаблон, вставляем его в выходной документ, заменяем ключевые слова, повторяем до конца записей. Не прокатило. Письмо может содержать несколько страниц, и при таком подходе, торможение ворда при росте объема документа приводит к тому, что рассылка на 30 писем может формироваться до часа. Пришлось включать голову и думать.
//загружаем ключевые слова
string [] keyWords = < "FNAME" , "LNAME" , "DEBT" , "MR" >;
//Ищем позиции ключевых слов в документе и добавляем в список
List keyWordEntries= new List();
for ( int i=0; iforeach ( string keyWord in keyWords)
if (sdoc.Words[i+1].Text.Trim()==keyWord)
keyWordEntries.Add( new keyWordEntry(keyWord,i+1,sdoc.Words[i+1].Text.Remove(0,keyWord.Length)));
>;
>;
>;
* This source code was highlighted with Source Code Highlighter .
Тут же обнаруживаются первые приколы работы с вордом (точнее они в этом тексте первые, а в процессе изысканий они были почти последнии): массивы элементов документов (Words, Paragraphs, ets) нумеруются с единицы; пробелы стоящие после слова, ворд легко может считать частью слова – пришлось писать логику их сохранения.
Создаем выходной документ на основе шаблона, так мы малой кровью можем получить документ с нужной разметкой страницы, колонтитулами, стилями и т.п.
_Document ddoc = word.Documents.Add( ref template, ref oMissing, ref oMissing, ref oMissing);
//Удаляем из него всё наполнение
ddoc.Range( ref oMissing, ref oMissing).Delete( ref oMissing, ref oMissing);
* This source code was highlighted with Source Code Highlighter .
for ( int i = 0; i < rowCount; i++)
ddoc.Range( ref oMissing, ref oMissing).InsertParagraphAfter();
>;
* This source code was highlighted with Source Code Highlighter .
И начинаем заполнять от конца к началу, чем получаем бешенный прирост скорости, т.к. обращаемся по индексу параграфа, а не ищем каждый раз конец документа. Само заполнение выглядит следующим образом (sdoc – временный документ, в который подставляем значения, ddoc – тот который должен получится):
for ( int i = rowCount; i > 0; i--)
if (i < rowCount)
ddoc.Paragraphs[i].Range.InsertParagraphAfter();
ddoc.Paragraphs[i + 1].Range.InsertBreak( ref pageBreak);
>;
//подставляем слова во временный документ
foreach (keyWordEntry ke in keyWordEntries)
string replaceWith = "" ;
switch (ke.keyword)
//тут логика подстановки
default :
replaceWith = ke.keyword+ke.spacesAfter;
break ;
>;
sdoc.Words[ke.position].Text = replaceWith;
>;
sdoc.Range( ref oMissing, ref oMissing).Copy();
ddoc.Paragraphs[i].Range.Paste();
>
* This source code was highlighted with Source Code Highlighter .
По-существу всё, осталось сохранить полученный документ и корректно завершить процесс ворда.
Еще пару слов в догонку: символы '.', ',', '*' и все остальные, ворд считает отдельным словом и если вам нужно вставит, например, дату, то логика слегка усложнится.
Пример кода
В примере кода в этой статье показано, как выполнить следующие действия:
- Вставка абзацев с текстом и форматированием.
- Просмотр и изменение различных диапазонов в документе.
- Вставка таблиц, форматирование таблиц и заполнение таблиц данными.
- Добавление диаграммы.
Добавьте ссылку на библиотеку объектов Microsoft Word. Для этого выполните следующие действия:
- On the Project menu, click Add Reference.
- На вкладке COM найдите объект библиотека объектов Microsoft Word и нажмите кнопку Выбрать.
Note (Примечание ) В Visual Studio 2005 не нужно нажимайте кнопку выбрать.
Note (Примечание ) В состав Microsoft Office 2003 входят основные сборки взаимодействия (PIA). Microsoft Office XP не включает PIA, но их можно скачать.
В меню Вид выберите пункт Панель элементов, чтобы отобразить панель элементов, а затем добавьте кнопку в форму Form1.
Дважды щелкните элемент Button1. Откроется окно кода для формы.
В окне код замените следующий код:
Прокрутите окно до верхней части окна кода. Добавьте следующую строку в конец списка директив using:
Нажмите клавишу F5 для построения и запуска программы.
После завершения кода проверьте созданный документ. Документ содержит две страницы форматированных абзацев, таблиц и диаграмм.
Использование шаблона
Если вы используете автоматизацию для создания документов, отформатированных в общем формате, можно воспользоваться новым документом, основанным на предварительно отформатированном шаблоне. Использование шаблона с клиентом автоматизации Word имеет два существенных преимущества по сравнению с созданием документа из ничего:
- Вы можете больше управлять форматированием и размещением объектов в документах.
- Вы можете создавать документы с меньшим количеством кода.
С помощью шаблона можно выполнить точную настройку размещения таблиц, абзацев и других объектов в документе, а также включить форматирование для этих объектов. С помощью автоматизации можно создать новый документ на основе шаблона, используя следующий код:
В шаблоне можно определить закладки, чтобы клиент автоматизации мог заполнять переменный текст в определенном месте документа, как показано ниже:
Еще одно преимущество использования шаблона состоит в том, что вы можете создавать и хранить стили форматирования, которые вы хотите применить во время выполнения, следующим образом:
Ссылки
Для получения дополнительных сведений ознакомьтесь со статьями базы знаний Майкрософт:
В этом пошаговом руководстве показано, как создать настройку на уровне документа, использующую элементы управления содержимым, для создания структурированного и повторно используемого содержимого в шаблоне Microsoft Office Word.
Применимость. Информация в этой статье относится к проектам уровня документа для Word.- Дополнительные сведения см. в разделе доступность функций по типам приложений Office и проектов.
Word позволяет создать коллекцию многократно используемых частей документа, именуемых стандартными блоками. В этом пошаговом руководстве демонстрируется создание двух таблиц в качестве стандартных блоков. Каждая из них содержит несколько элементов управления, которые могут включать разные типы содержимого, например обычный текст или даты. Одна из таблиц содержит информацию о сотруднике, а другая таблица содержит отзывы.
После создания документа на основе шаблона можно добавить любую из таблиц в документ, используя несколько объектов BuildingBlockGalleryContentControl, отображающих доступные стандартные блоки в шаблоне.
В этом пошаговом руководстве описаны следующие задачи:
создание таблиц с элементами управления содержимым в шаблоне Word во время разработки;
заполнение элемента управления содержимым «Поле со списком» и элемента управления содержимым «Раскрывающийся список»;
запрет редактирования указанной таблицы пользователями;
добавление таблиц в коллекцию стандартных блоков шаблона;
создание элемента управления содержимым, отображающего доступные стандартные блоки в шаблоне.
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.
Предварительные требования
Для выполнения этого пошагового руководства требуются следующие компоненты:
Выпуск Visual Studio, включающий инструменты разработчика Microsoft Office. Дополнительные сведения см. в статье Настройка компьютера для разработки решений Office.
Создание нового проекта шаблона Word
Создайте шаблон Word, чтобы пользователи могли легко создавать собственные копии.
Создание проекта шаблона Word
Создайте проект шаблона Word с именем мибуилдингблокктемплате. В мастере создайте документ в решении. дополнительные сведения см. в разделе инструкции. создание проектов Office в Visual Studio.
Visual Studio открывает новый шаблон Word в конструкторе и добавляет проект мибуилдингблокктемплате в Обозреватель решений.
Создание таблицы Employee
Создайте таблицу, содержащую четыре различных типа элементов управления содержимым, в которой пользователь может ввести сведения о сотруднике.
Создание таблицы сотрудников
В шаблоне Word, размещенном в Visual Studio конструкторе, на ленте щелкните вкладку Вставка .
В группе таблицы щелкните Таблица и вставьте таблицу с двумя столбцами и четырьмя строками.
Введите текст в первый столбец, как показано в следующем столбце:
Щелкните первую ячейку во втором столбце (рядом с именем сотрудника).
На ленте перейдите на вкладку Разработчик .
Если вкладка Разработчик не отображается, сделайте ее видимой. Дополнительные сведения см. в разделе инструкции. Отображение вкладки разработчика на ленте.
В группе элементы управления нажмите кнопку Text ( текст ), чтобы добавить в PlainTextContentControl первую ячейку.
Щелкните вторую ячейку во втором столбце (рядом с полем Дата найма).
В группе элементы управления нажмите кнопку выбора даты , чтобы добавить DatePickerContentControl к второй ячейке.
Щелкните третью ячейку во втором столбце (рядом с заголовком).
В группе элементы управления нажмите кнопку с полем со списком , чтобы добавить в ComboBoxContentControl третью ячейку.
Щелкните последнюю ячейку во втором столбце (рядом с изображением).
В группе элементы управления нажмите кнопку с изображением элемента управления содержимым , чтобы добавить PictureContentControl к последней ячейке.
Создание таблицы отзывов клиентов
Создайте таблицу, содержащую три различных типа элементов управления содержимым, в которой пользователь может ввести отзывы клиентов.
Создание таблицы отзывов клиентов
В шаблоне Word щелкните строку после добавленной ранее таблицы Employee и нажмите клавишу Ввод , чтобы добавить новый абзац.
На ленте щелкните вкладку Вставка .
В группе таблицы щелкните Таблица и вставьте таблицу с двумя столбцами и тремя строками.
Введите текст в первый столбец, как показано в следующем столбце:
Щелкните первую ячейку второго столбца (рядом с полем имя клиента).
На ленте перейдите на вкладку Разработчик .
В группе элементы управления нажмите кнопку Text ( текст ), чтобы добавить в PlainTextContentControl первую ячейку.
Щелкните во второй ячейке второго столбца (рядом с рейтингом удовлетворенности).
В группе элементы управления нажмите кнопку раскрывающегося списка , чтобы добавить DropDownListContentControl к второй ячейке.
Щелкните последнюю ячейку второго столбца (рядом с комментариями).
В группе элементы управления нажмите кнопку форматированный текст , чтобы добавить RichTextContentControl к последней ячейке.
Заполнение поля со списком и раскрывающегося списка программным способом
Элементы управления содержимым можно инициализировать во время разработки с помощью окна Свойства в среде Visual Studio . Также их можно инициализировать во время выполнения, что позволяет динамически задавать их начальное состояние. В этом пошаговом руководстве используется код для заполнения записей в ComboBoxContentControl и DropDownListContentControl во время выполнения, чтобы можно было увидеть, как работают эти объекты.
Изменение пользовательского интерфейса элементов управления содержимым программным способом
В Обозреватель решений щелкните правой кнопкой мыши ThisDocument. CS или ThisDocument. vb и выберите пункт Просмотреть код.
Добавьте в класс ThisDocument приведенный далее код. В этом коде объявляются несколько объектов, которые вы будете использовать позже в этом пошаговом руководстве.
Добавьте в метод ThisDocument_Startup класса ThisDocument следующий код. Этот код добавляет записи в таблицы ComboBoxContentControl и DropDownListContentControl и задает замещающий текст, отображаемый в каждом из этих элементов управления, прежде чем пользователь изменяет их.
Запретить пользователям изменять таблицу сотрудников
Используйте объект GroupContentControl, объявленный ранее, для защиты таблицы сотрудников. После применения защиты пользователи по-прежнему смогут редактировать элементы управления содержимым в таблице. Однако они не смогут изменять текст в первом столбце или изменять таблицу иным способом, например добавляя или удаляя строки и столбцы. Дополнительные сведения об использовании GroupContentControl для защиты части документа см. в разделе элементы управления содержимым.
Запрет редактирования указанной таблицы пользователями
Добавьте следующий код в метод ThisDocument_Startup класса ThisDocument после кода, добавленного на предыдущем шаге. Этот код предотвращает изменение таблицы сотрудников, помещая таблицу внутри объекта GroupContentControl, объявленного ранее.
Добавление таблиц в коллекцию стандартных блоков
Добавьте таблицы в коллекцию стандартных блоков документа в шаблоне, чтобы пользователи могли вставлять таблицы, созданные вами в документе. Дополнительные сведения о стандартных блоках документов см. в разделе элементы управления содержимым.
Добавление таблиц в стандартные блоки в шаблоне
Добавьте следующий код в метод ThisDocument_Startup класса ThisDocument после кода, добавленного на предыдущем шаге. Этот код добавляет новые стандартные блоки, содержащие таблицы, в корпорацию Майкрософт. Office. Коллекция Interop. Word. Буилдингблоккентриес, которая содержит все многократно используемые стандартные блоки в шаблоне. Новые стандартные блоки определяются в новой категории с именем Employee и Customer , и им назначается тип стандартного блока Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCustom1 .
Добавьте следующий код в метод ThisDocument_Startup класса ThisDocument после кода, добавленного на предыдущем шаге. Этот код удаляет таблицы из шаблона. Таблицы более не нужны, поскольку вы добавили их в коллекцию повторно используемых стандартных блоков в шаблоне. Код сначала переводит документ в режим конструктора, чтобы можно было удалить защищенную таблицу сотрудников.
Создание элемента управления содержимым, отображающего стандартные блоки
Создайте элемент управления содержимым, предоставляющий доступ к стандартным блокам (таблицам), созданным ранее. Пользователи могут щелкнуть этот элемент управления, чтобы добавить таблицы в документ.
Создание элемента управления содержимым, отображающего доступные стандартные блоки
Добавьте следующий код в метод ThisDocument_Startup класса ThisDocument после кода, добавленного на предыдущем шаге. Этот код инициализирует объект BuildingBlockGalleryContentControl, объявленный ранее. Компонент BuildingBlockGalleryContentControl отображает все стандартные блоки, определенные в категории Employee и Customer , с типом стандартного блока Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCustom1 .
Тестирование проекта
Пользователи могут щелкнуть элементы управления коллекции стандартных блоков в документе, чтобы вставить таблицу сотрудников или отзывов. Пользователи могут ввести или выбрать ответы в элементах управления содержимым в обеих таблицах. Пользователи могут изменять другие части таблицы отзывов, но они не смогут менять другие части таблицы сотрудников.
Проверка таблицы сотрудников
Нажмите клавишу F5 , чтобы запустить проект.
Щелкните выбрать первый стандартный блок , чтобы отобразить первый элемент управления содержимым коллекции стандартных блоков.
Щелкните стрелку раскрывающегося списка рядом с заголовком настраиваемой коллекции 1 в элементе управления и выберите таблица сотрудников.
Щелкните ячейку справа от ячейки имя сотрудника и введите имя.
Убедитесь, что в эту ячейку можно добавить только текст. PlainTextContentControl позволяет пользователям добавлять только текст, но не другие типы содержимого, такие как изображения или таблицы.
Щелкните ячейку справа от ячейки Дата найма и выберите дату в элементе выбора даты.
Щелкните ячейку справа от ячейки Title (заголовок ) и выберите один из названий заданий в поле со списком.
При необходимости введите имя должности, которого нет в списке. Это возможно, поскольку ComboBoxContentControl позволяет пользователям выбрать из списка записей или ввести собственную запись.
Щелкните значок в ячейке справа от ячейки изображения и перейдите к изображению, чтобы отобразить его.
Попробуйте добавить строки или столбцы в таблицу и попытайтесь удалить строки и столбцы из нее. Убедитесь, что изменить таблицу нельзя. GroupContentControl не позволяет вносить какие-либо изменения.
Проверка таблицы отзывов клиентов
Щелкните выбрать второй Стандартный блок , чтобы отобразить второй элемент управления содержимым коллекции стандартных блоков.
Щелкните стрелку раскрывающегося списка рядом с заголовком настраиваемой коллекции 1 в элементе управления и выберите таблица Customer.
Щелкните ячейку справа от ячейки имя клиента и введите имя.
Щелкните ячейку справа от ячейки рейтинг удовлетворенности и выберите один из доступных вариантов.
Убедитесь, что нельзя вводить записи. DropDownListContentControl позволяет пользователям только выбирать варианты из списка элементов.
Щелкните ячейку справа от ячейки Примечания и введите несколько комментариев.
При необходимости добавьте содержимое, отличное от текста, например изображение или вложенную таблицу. Это возможно, поскольку RichTextContentControl позволяет пользователям добавлять содержимое, отличное от текста.
Убедитесь, что вы можете добавить строки или столбцы в таблицу и удалить строки и столбцы из нее. Это возможно, поскольку вы не защитили таблицу, поместив ее в GroupContentControl.
Дальнейшие действия
Дополнительные сведения об использовании элементов управления содержимым см. в следующем разделе:
Как показала практика работы с ERP системами — корпоративные приложения на 30% состоят из отчетов. Типичная ситуация для таких приложений — построить отчет по некоторым данным.
Для построения отчетов можно использовать ReportBuilder или любые другие системы построения отчетов. В этой статье я хочу рассмотреть построение отчетов в MS Word 2003 (и более поздние версии) посредством Aspose.Words, так как легко вносить правки, удобно разрабатывать, не требует особых навыков по работе с гигантами систем отчетов и т.д.
По однотипному набору данных требуется создавать шаблоны отчетов, которые представляют из себя обычный документ Word 2003 с набором ключевых полей.
Потом можно настроить шаблон как угодно, то есть привести его к тому виду в котором он должен выглядеть в конечном варианте. То есть создаем шаблон печатных форм для выбранного набора данных.
Плюсом такого решения является то, что человек, занимающийся разработкой самой печатной формы, может не иметь никаких знаний о SQL или источниках данных. Он должен лишь уметь работать с MS Office Word. Казалось бы, все просто, но в нашем случае предполагается, что:
- создание шаблона отчета и самого отчета может происходить на компьютере, где не установлен MS Office. Это отсекает возможность использовать COM;
- шаблоны отчетов имеют формат doc, а не docx, что было бы довольно удобно;
Постановка задачи
- На сервере где крутится продукт — не должен быть установлен Ms Word и иже с ним
- Это должен быть именно Word 2003, спасибо что не 95
- Удобное, а главное быстрое решение задачи
- Шаблоны отчетов должны быть настолько просты, что их мог бы создавать конечный бизнес-пользователь
Итак, задача ясна, приступаем.
Основными элементами печатных форм являются обычные поля с данными и таблицы данных. Для удобства работы разделим создание набора полей в шаблоне и создание таблицы в отдельные методы.
Обратите внимание на строку
Здесь в таблицу добавляется ключевое поле TableStart с внешним символом «TableEnd с символом «>». Эти поля должны быть в одной строке таблицы. Поля, заключенные между ними, относятся к текущей таблице и будут повторяться для набора данных. То есть, если надо расположить данные на нескольких строках, получите ошибку.
Но есть хитрость: можно добавить таблицу из трех колонок открывающий символ в первую колонку, закрывающий символ в последнюю колонку, а в средней ячейке вставить еще одну таблицу, данные в которой могут быть оформлены как угодно. Вставленная таблица и будет повторяться для каждого набора данных. По умолчанию это не добавлено, так как требуется редко (по крайней мере в тех целях где сейчас применяется).
Этих двух методов вполне достаточно для создания шаблона. Далее этот шаблон настраивается (шрифты, разметка и прочее) — нас это не сильно интересует. Осталось только заполнить данными готовый шаблон, сохранив при этом разметку. Для заполнения полей, не находящихся в таблице, все просто:
Теперь мы подошли к заполнению таблиц. В Aspose к этому вопросу подошли весьма капитально, в чем Вы скоро убедитесь.
Тут все довольно просто, но давайте глянем:
Вот и все, необходимый минимум есть. Изменения в разметке не происходят, пустые поля (для которых нет данных) просто исчезают в печатной форме. При заполнении полей значениями надо передавать object, но здесь везде передается string. В принципе можно передать любые типы данных, а потом, имплементировав IFieldMergingCallback, обработать и отформатировать данные.
Прикрутить свой обработчик можно, присвоив doc.MailMerge.FieldMergingCallback экземпляр-обработчик. То есть потенциально можно сделать сколько потребуется обработчиков для
всех случаев жизни и всех наборов данных. Чередуя присвоение обработчика с вызовом doc.MailMerge.ExecuteWithRegions(), получим более гибкую обработку.
В разработке корпоративных приложений очень часто приходится решать задачу выгрузки данных в документы — от небольших справок до больших отчетов.
Хочу поделиться нашим opensource-решением для генерации docx документов, которое позволяет заполнять документы по шаблону, оформление которого можно менять в Word без переписывания кода.
Для начала — немного вводных.
Что нам было нужно от шаблонизатора
- Шаблон создается в Word и сразу видно, на что будет похож результирующий документ, шаблон без лишнего мусора.
- Результирующий документ после скачивания содержит все необходимые данные, не подтягивая их с внешних источников.
- Возможность заполнять списки, таблицы, и иногда еще и таблицы с вложенными в них списками.
- Шаблон можно доверить секретарю клиента, чтобы он мог сменить логотип, реквизиты компании, или как-либо еще подкорректировать оформление. И все это уже после сдачи проекта, не модифицируя наш код.
Поиски шаблонизатора
Что получилось у нас
Со стороны кода мы работаем с привычными сущностями, такими как «Таблица», «Список», «Строка», «Ячейка».
Со стороны шаблона используется документ с расставленными по нему Content Controls, которые связаны с данными через свойство tag. Content Controls добавляются достаточно легко, при этом их достаточно сложно испортить при дальнейшей эксплуатации в отличие от текстовых вставок типа , а при отключенном режиме конструктора спец-обозначений контролов и вовсе не видно.
Например, необходимо заполнить таблицу, указать дату её заполнения и количество записей.
Создадим шаблон этой таблицы в Word-документе:
- Переходим на вкладку «Разработчик» (если она отсутствует, включается через Файл → Параметры → Настроить ленту → Ставим галочку возле «Разработчик») и включаем режим конструктора.
- Выделяем текст, который будет заполняемым полем.
- Нажимаем «Вставить элемент управления содержимым «Форматированный текст».
- Нажимаем «Свойства» и заполняем поля «Название» и «Тег».
Если требуется заполнить таблицу или список, их также нужно поместить в отдельный контент-контрол.
Так выглядит шаблон с добавленными элементами управления содержимым:
Теперь заполним шаблон данными:
нам нужно добавить одно поле и одну таблицу с двумя строчками, и в футере таблицы указать количество записей.
Если всё получилось, на выходе следующий документ:
С помощью метода SetRemoveContentControls(bool value) можно удалить элементы управления содержимым, если они уже не нужны в результирующем документе.
TemplateEngine.Docx позволяет заполнять простые поля, таблицы, списки, вложенные списки, таблицы со списками, списки с таблицами и даже списки с таблицами, в которых есть списки… Структура класса Content позволяет создавать шаблоны с неограниченной вложенностью элементов.
Еще больше примеров!
Заполнение простых полей
Заполнение вложенных списков
Таблица внутри списка
Список внутри таблицы
Таблица, состоящая из нескольких блоков, которые заполняются независимо
Таблица с объединенными вертикально ячейками
Таблица с объединенными горизонтально ячейками
Где скачать
Всем спасибо за внимание, надеемся, что данный инструмент поможет вам в ваших проектах.
Читайте также: