C# библиотека для сборки документа Word

Алексей12 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
17.07.2013

Цель проекта - создать C# библиотеку, которая будет частью приложения для помощи преподавателям в создании тестов для студентов. Допустим, у преподавателя есть документ с 200 вопросами для тестов. Преподаватель хочет сделать тест из 40 вопросов. Задача библиотеки - автоматизировать копирование и вставку этих вопросов из .docx файла, содержащего все вопросы, в .docx файл для конкретного теста из 40 вопросов.

Оригинальный .docx документ размечен так:

***begin:question1

content (mostly text, but including images, text boxes, drawings, equations, etc.)

***end:question1

***begin:question2

more content

***end:question2

и т.д.

Библиотека будет использована в программе для сборки .docx документов. Работа с библиотекой должна выглядеть примерно так:

string[] partsToInclude = new string[] { "titlepage", "instructions", "question1", "question3", "question5", "footer" };

DocumentAssembler myDoc = new DocumentAssembler(@"c:\master.docx");

myDoc.CreateSubDocument(partsToInclude, @"c:\newdocument.docx");

... для создания newdocument.docx, который содержит части master.docx между ***begin:xxx и ***end:xxx заголовками, указанными в массиве partsToInclude.

Мы можем немного изменять формат разметки документа, например, если будет нужно, все ***begin и ***end разделители могут быть в каком-то определенном стиле.

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

Кроме основного копирование, желательно иметь еще одну вещь в классе DocumentAssembler. Может быть 2 типа содержимого для копирования из оригинального документа в новый - части, обозначенные как "question" и части, обозначенные по-другому (титульный лист, инструкции, и т.п.)

Желательно, чтобы DocumentAssembler отслеживал "текущий номер вопроса", и заменял текст "###" внутри блока содержимого на этот номер вопроса. Нумерация вопросов начинается с 1 и увеличивается после каждого блока "question".

То есть, для примера, если в оригинальном документе есть блок:

***begin:question78

###. What color is the sky?

A. red B. blue C. green D. purple

***end:question78

и создан тест, использующий блоки "titlepage", "question60", "question78", то ### в вопросе 78 будет заменено на строку "2", так как это второй блок в результирующем документе, имя которого начинается с "question".

Приемлимо (и желательно) использовать готовые библиотеки для этого проекта, например Open XML SDK от Microsoft.

Пример файла с вопросами - в приложении.