Foxby — это библиотека для работы с Word документами в формате OpenXml. Предназначена для генерации документов по шаблону и внесения изменений в существующие документы. С помощью неё вы сможете отказаться от работы с COM+ или редактирования OpenXML-дерева через OpenXML SDK и перейти к механизму построения структуры документа из метаэлементов в декларативном виде.
В классе решаемых задач: создание параграфов, создание и заполнение таблиц, списков, работа с изображениями, форматирование и т.п. Фактически библиотека является оберткой над OpenXML SDK с API в виде Fluent-интерфейса.
Мы сами используем эту библиотеку уже в двух проектах. Первая версия была написана Eskat0n и зарождалась, как часть подсистемы проекта по работе с Word-документами, но в дальнейшем была вынесена в самостоятельный проект.
Можно выделить следующие преимущества:
Последнюю версию можно установить через NuGet:

Исходный код написан на .NET 4.0/C# и выложен на Google Code:fluent-openxml компанией IndyCode под лицензией LGPL.
Ниже приведены примеры, с помощью которых можно будет начать работать с библиотекой.

SimpleTemplate.EmptyWordFile это шаблон, который встроен в саму библиотеку. В шаблоне ничего нет, кроме тэгов для верхнего колонтитула, контента и нижнего колонтитула. Этот шаблон отлично подойдет для тестовых целей и генерации простых документов.
Вместо File.WriteAllBytes, который записывает файл на диск, массив байт можно передавать как FileResult, чтобы пользователь сразу получал сгенерированный документ.
Иерархия вложения должна помочь понять идеологию работы с библиотекой:
Очень часто требуется создать договор или счет-фактуру. Этот пример показывает типичный сценарий создания документа. Для простоты переменные берутся не из базы данных, а определяются переменными.

Сценарий:


К библиотеке написано довольно много модульных тестов, с помощью которых вы сможете еще лучше понять сценарии работы. Скачать исходный код с тестами можно с Google Code:fluent-openxml.
Александр Зайцев поразвлекался и сделал довольно интересную реализацию для форматирования текста:
Такой способ можно использовать для текста, как альтернативу для свойства Bold.
Эта библиотека может быть лучше и работать с большим количеством различных специфических ситуаций, если вы дадите нам обратную связь.
Ссылки
Видео и слайды с конференции DotNetConf: Анонс OpenSource библиотеки для создания и изменения документов в формате OpenXml через Fluent-интерфейс
В классе решаемых задач: создание параграфов, создание и заполнение таблиц, списков, работа с изображениями, форматирование и т.п. Фактически библиотека является оберткой над OpenXML SDK с API в виде Fluent-интерфейса.
Преимущества использования
Мы сами используем эту библиотеку уже в двух проектах. Первая версия была написана Eskat0n и зарождалась, как часть подсистемы проекта по работе с Word-документами, но в дальнейшем была вынесена в самостоятельный проект.
Можно выделить следующие преимущества:
- На сервере, где работает ваше приложение, не требуется установка Microsoft Office
- Нет проблемы с зависшими процессами Word
- Работает гораздо быстрее, чем COM+
- Создание и изменение документов не требует записи на жесткий диск, всё происходит в оперативной памяти
- Удобный Fluent API для работы с объектами Word
- Возможность построения своего метаязыка разметки документа
Установка
Последнюю версию можно установить через NuGet:

Исходный код и лицензия
Исходный код написан на .NET 4.0/C# и выложен на Google Code:fluent-openxml компанией IndyCode под лицензией LGPL.
Примеры использования
Ниже приведены примеры, с помощью которых можно будет начать работать с библиотекой.
Пример №1 — Hello Word!
private static void Main()
{
using (var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);
builder
.Tag(SimpleTemplate.ContentTagName,
x => x.Center.Paragraph(z => z.Bold.Text("Hello Word!")));
File.WriteAllBytes(string.Format(@"D:\Word.docx"), docxDocument.ToArray());
}
}
* This source code was highlighted with Source Code Highlighter.

SimpleTemplate.EmptyWordFile это шаблон, который встроен в саму библиотеку. В шаблоне ничего нет, кроме тэгов для верхнего колонтитула, контента и нижнего колонтитула. Этот шаблон отлично подойдет для тестовых целей и генерации простых документов.
Вместо File.WriteAllBytes, который записывает файл на диск, массив байт можно передавать как FileResult, чтобы пользователь сразу получал сгенерированный документ.
Иерархия вложения должна помочь понять идеологию работы с библиотекой:

Пример №2 Создадим договор
Очень часто требуется создать договор или счет-фактуру. Этот пример показывает типичный сценарий создания документа. Для простоты переменные берутся не из базы данных, а определяются переменными.
private static void Main()
{
string customerName = "Иванов И.В.";
string orderNumber = "4";
string itemName1 = "Табуретка";
string itemSumm1 = "5 000";
string itemName2 = "Кран погрузочный";
string itemSumm2 = "6 342";
string summ = "11 342";
using (var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);
builder
.Tag(SimpleTemplate.ContentTagName,
x => x
.Center.Paragraph(z => z.Bold.Text(string.Format("Договор №{0}", orderNumber)))
.Right.Paragraph(string.Format("от {0} г.", DateTime.Now.ToString("dd MMMM yyyy")))
.Left.Paragraph(string.Format("Я, {0}, покупаю:", customerName))
.Table(t => t.Column("Товар", 70).Column("Цена, руб.", 30),
r => r.Row(itemName1, itemSumm1)
.Row(itemName2, itemSumm2)
.Row(w => w.Right.Bold.Text("Итого:"), w=>w.Center.Bold.Underlined.Text(summ))
));
File.WriteAllBytes(string.Format(@"D:\Word.docx"), docxDocument.ToArray());
}
}
* This source code was highlighted with Source Code Highlighter.

Пример №3 — Изменяем созданный документ
Сценарий:
- Создаем документ за подписью Иванова К.И.
- Отправляем документ на согласование
- Электронный документ возвращают и говорят, что подписывать должен Петров А.И.
- Меняем подписывающего в документе
private static void Main()
{
using (var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);
builder
.Tag(SimpleTemplate.ContentTagName,
x => x.Left.Paragraph("Договор на оказание услуг...")
.Right.Paragraph(z => z.Placeholder("SIGNER_NAME", "Иванов К.И.")));
File.WriteAllBytes(string.Format(@"D:\Word.docx"), docxDocument.ToArray());
}
using (var docxDocument = new DocxDocument(File.ReadAllBytes(@"D:\Word.docx")))
{
var builder = new DocxDocumentBuilder(docxDocument);
builder
.Placeholder("SIGNER_NAME", x => x.Text("Петров А.И."));
File.WriteAllBytes(string.Format(@"D:\Word.docx"), docxDocument.ToArray());
}
}
* This source code was highlighted with Source Code Highlighter.

Пример №4 — Создаем документ «с нуля»
private static void Main()
{
using (var docxDocument = new DocxDocument())
{
docxDocument.AddOpenCloseTag("CONTENT");
var builder = new DocxDocumentBuilder(docxDocument);
builder
.Tag("CONTENT", x => x.Left.Paragraph("Договор на оказание услуг..."));
File.WriteAllBytes(string.Format(@"D:\Word.docx"), docxDocument.ToArray());
}
}
* This source code was highlighted with Source Code Highlighter.

Пример №5 — Модульные тесты
К библиотеке написано довольно много модульных тестов, с помощью которых вы сможете еще лучше понять сценарии работы. Скачать исходный код с тестами можно с Google Code:fluent-openxml.
Плюшки
Александр Зайцев поразвлекался и сделал довольно интересную реализацию для форматирования текста:
builder.Tag("CONTENT", x => x.Paragraph("Жирный ".Bold() + "Курсив ".Italic() + "Подчеркнутый ".Underlined() + "Нормальный"));
* This source code was highlighted with Source Code Highlighter.
Такой способ можно использовать для текста, как альтернативу для свойства Bold.
Обратная связь
Эта библиотека может быть лучше и работать с большим количеством различных специфических ситуаций, если вы дадите нам обратную связь.
Ссылки
Видео и слайды с конференции DotNetConf: Анонс OpenSource библиотеки для создания и изменения документов в формате OpenXml через Fluent-интерфейс