morpher.ru 8 (499) 647 86 54
nowhere@morpher.ru
 
 

Генерация документов Word по шаблону из C#

EasyDox.dll – это бесплатная .NET библиотека для генерации вордовских документов (docx) по шаблону. Использовать ее очень просто:

var fieldValues = new Dictionary <string, string> {
    {"№ договора", "123-456/АГ"},
    {"Сторона 1",  "ООО «Ромашка»"},
    {"Сторона 2",  "ЗАО «Тюльпан»"},
    {"Подписант 1", "Иванов И.П."},
    {"Должность 1", "генеральный директор"},
    {"Основание 1", "Устав"},
};

var engine = new Engine ();

engine.Merge ("c:\\template.docx", fieldValues, "c:\\output.docx");

Функция Merge читает указанный файл шаблона и подставляет в него значения полей, заданных параметром fieldValues, и затем сохраняет результат в "c:\output.docx". Например, шаблон:

ДОГОВОР № № договора

Сторона 1 и Сторона 2 заключили настоящий Договор о нижеследующем...

После подстановки значений полей превращается в:

ДОГОВОР № 123-456/АГ

ООО «Ромашка» и ЗАО «Тюльпан» заключили настоящий Договор о нижеследующем...

Кроме простых подстановок библиотека умеет выполнять различные преобразования, такие как склонение по падежам и запись денежных сумм прописью. Например, чтобы просклонять ФИО подписанта в договоре, добавляем в скобках (родительный):

1.1   Организация 1 в лице Должность (родительный) Подписант (родительный), действующего на основании Основание 1 (родительный)...

После подстановок получаем связный текст:

1.1   ООО «Ромашка» в лице генерального директора Иванова И.П., действующего на основании Устава...

Список преобразований

Преобразование Что делает
(родительный) Ставит предшествующую позицию в родительный падеж.
(цифрами и прописью) Преобразует число в запись суммы в рублях цифрами и прописью.

Текущая (первая) версия библиотеки включает в себя минимум преобразований. В последующих версиях будут добавлены остальные падежи для русского и украинского, а также возможность склонения по родам.

Библиотека расширяема и позволяет добавлять собственные преобразования. Набор пользовательских преобразований (функций) передается в конструктор класса Engine.

Поля в колонтитулах (верхних и нижних) пока не обрабатываются.

Как создать шаблон docx

Шаблон – это обычный вордовский документ с расширением docx, в который в нужных местах вставлены поля. Чтобы вставить поле, перейдите на вкладку Вставка (Insert), нажмите Экспресс-блоки (Quick Parts), затем Поле (Field).

Откроется окно. В нем выберите тип поля MergeField, введите название поля и если нужно, преобразование в скобках:

Нажмите OK для вставки поля.

Технические параметры библиотеки

Библиотека собрана под платформу AnyCPU (MSIL). Не требует установки OpenXml SDK. Все классы потокобезопасны.

Скачать

Начать работу с библиотекой проще всего с примера:

Этот пример подставляет в шаблон договора ФИО директора в родительном падеже.

Добавить библиотеку EasyDox.Morpher.dll в имеющийся проект очень просто при помощи менеджера пакетов Nuget:

Пакет EasyDox.Morpher имеет зависимости от пакетов EasyDox и Morpher.API, поэтому при его установке в вашем распоряжении оказываются все нужные библиотеки.

Вам также могут быть интересны исходные коды библиотек:

Возможно, вы захотите что-то дополнить или исправить. Пулл-реквесты приветствуются.

Граф зависимостей


Комментарии

Добавить комментарий
Антон 07.05.2015 06:03 UTC

Здравствуйте, скажите пожалуйста у Вас сказано, что EasyDox.dll – это бесплатная .NET библиотека для генерации вордовских документов (docx) по шаблону. Но библиотеку невозможно подключить, не имеет строго имени. Спасибо.



(аноним) 01.09.2015 12:16 UTC

В русской версии офиска покажите, скажал, мне каждый месяц надо склонять списки фамилий в родительный падеж, помогите пожалуйся)



Альберт 04.11.2015 17:26 UTC

Здравствуйте!

Огромное Вам спасибо за труд. Пользуюсь Вашей библиотекой уже не первый день.
Главное преимущество в том, что поля сохраняют форматирование указанное в шаблоне.

К сожалению (может я сам просто не разобрался), в функции замены нельзя использовать циклы и массивы. Т.е. если однотипных переменных 150 штук Сторона1 - Сторона150, то приходится 150 строк кода писать (или копировать из excel).

Но всё равно, очень удобная библиотека! Спасибо!



Сергей Слепов 04.11.2015 21:41 UTC

Альберт, рад, что библиотека вам пригодилась. Про циклы - может быть, сделать так:

for (int i = 1; i <= 150; ++i)
{
fieldValues.Add("Сторона " + i, GetFieldValue (i));
}

Но тогда придется добавлять 150 полей в шаблон. Наверное, проблема в этом? Или в том, что 150 может быть переменной?



Альберт 07.11.2015 19:21 UTC

Сергей Слепов, огромное Вам спасибо!!!

Создал массив, наполнил его, и с помощью Вашей функции, указанной выше, смог произвести автоматическую замену. Ниже приведу код, может кому-нибудь понадобится:

string[] Condition = new string[3]; //Создания массива Condition из трёх элементов

//Наполнение массива с клавиатуры
for (int z = 0; z < 3; z++)
{
Condition[z] = Console.ReadLine();
}

//Объявление функции замены
var fieldValues = new Dictionary<string, string>
{ };

//Замена полей в документе на элементы массива
for (int i = 0; i < 3; ++i)
{
string z = i.ToString(); //Перевод int в string, для корректного сочетания "Сторона" + порядковый номер.
fieldValues.Add("Сторона" + z, Condition[i]);
}

var engine = new Engine();
engine.Merge ("C:\\...\\test.docx", fieldValues, "C:\\...\\output.docx");

Сергей, не напишите номер телефона? Хотел бы Вас отблагодарить чем смогу, Ваша библиотека сократила мне просто часы рабочего времени! Спасибо=)



Сергей Слепов 07.11.2015 20:18 UTC

Альберт, номер телефона в контактах. Рад, что смог помочь!



Константин 13.01.2016 20:25 UTC

Классная библиотека! Надо бы протестить. Но есть несколько вопросов:
1) // В данном примере для склонения по падежам используется веб-сервис morpher.ru,
// но вы можете легко перейти на библиотеку Morpher.Russian.dll.
var webService = new Morpher.WebService.V2.Client ();
Подскажите как именно перейти и что там вызывать?
2) И как с помощью Engine склонять?
За ранее спасибо!



Всеволод 23.03.2016 10:58 UTC

Уважаемые разработчики!
Работает ли эта библиотека на украинском языке?



Олег 27.10.2016 06:43 UTC

Как можно вставить с помощью этой библиотеки в ворд переход на новую строку? Пробовал "\r\n" , (char)13+(char)10, Environment.NewLine. Все не работает.



Eug 27.01.2017 12:52 UTC

Подскажите, как сформированный файл сохранить в поток или сохранить на FTP?



Сергей Слепов 05.02.2017 22:20 UTC

Олег, боюсь, что вставить перевод строки не удастся. Значение поля хранится в XML и добавление в него "непечатных символов" (\r\n) ничего не изменит. Попытка вставить <p>, <br> или подобное тоже не приведет к желаемому результату - символы будут должным образом экранироваться.

Такое поведение я считаю желательным, т.к. перенос строки - это форматирование, а все форматирование должно быть в шаблоне. Попробуйте уменьшить ширину колонки или абзаца, где находится поле, если хотите форсировать перенос строки.



Сергей Слепов 05.02.2017 22:26 UTC

Константин, Всеволод - библиотека EasyDox.dll сама не выполняет склонение, она только заменяет в документе поля на значения из словаря (класс Docx) и вычисляет значения функций, примененных к полям (класс Engine). Если рядом с именем поля указана функция в скобках, она вычисляется для данного поля, например: ФИО (родительный). Здесь ФИО - имя поля, "родительный" - функция.

Определения функций передаются в конструктор класса Engine. Так, EasyDoxSample.exe передает туда функции склонения и прописи, реализованные при помощи веб-сервиса "Морфер" (Morpher.WebService.V2.dll). Определения этих функций перечислены в EasyDox.Morpher.dll, который является адаптером между Морфером и EasyDox. Морфер и EasyDox друг про друга ничего не знают и знать не хотят, поэтому им нужен адаптер, чтобы общаться.

Склонение на украинском языке (и другие недостающие функции) можно легко реализовать, добавив определения этих функций в EasyDox.Morpher.dll или в другую подобную библиотеку. Все эти фунции реализованы в веб-сервисе.

Библиотека Morpher.Russian.dll платная. Она заменяет Morpher.WebService.V2.dll и избавляет вас от привязки к Интернету. Ну, и работает в тысячу раз быстрее. Заказать ее можно на странице заказа продуктов.

Я выложил исходный код EasyDox.dll на GitHub:

https://github.com/bzaar/EasyDox

Скоро выложу также исходный код EasyDox.Morpher.dll и тогда все станет предельно ясно.



Сергей Слепов 08.02.2017 10:20 UTC

Исходный код библиотеки EasyDox теперь в открытом доступе, см. секцию Скачать.



Добавить комментарий


 

Библиотеки

Заметили опечатку? Выделите слово мышкой и нажмите Ctrl-Enter. Система Orphus

© Сергей Слепов, 2003 - 2017. Перепечатка материалов сайта только с разрешения автора.