Генерация .docx из .dotx с использованием полей слияния (SimpleField) - PullRequest
1 голос
/ 22 марта 2012

Итак, во-первых, вот мой код, чтобы открыть dotx и создать новую копию docx (из которой затем модифицируется копия).Сокращенно для краткости, но, по сути, требуется 3 параметра таблицы данных (чтобы ее можно было использовать в устаревших системах), путь UNC в виде строки к шаблону и путь UNC в виде строки в выходной документ:

using (WordprocessingDocument docGenerated = WordprocessingDocument.Open(outputPath, true))
{
    docGenerated.ChangeDocumentType(WordprocessingDocumentType.Document);

    foreach (SimpleField field in docGenerated.MainDocumentPart.Document.Descendants<SimpleField>())
    {
        string mergeFieldName = GetFieldName(field).Trim();

        DataRow[] dr = dtSchema.Select("FieldName = '" + mergeFieldName + "'");

        if (dr.Length > 0)
        {
            string runProperties = string.Empty;
            foreach (RunProperties property in field.Descendants<RunProperties>())
            {
                runProperties = property.OuterXml;
                break;
            }

            Run run = new Run();
            run.Append(new RunProperties(runProperties));
            run.Append(new Text(dr[0]["FieldDataValue"].ToString()));

            field.Parent.ReplaceChild<SimpleField>(run, field);
        }
    }

    docGenerated.MainDocumentPart.Document.Save();
}

Первоначально я взял шаблон .dot и повторно сохранил его как .dotx, скрестив пальцы, не сработало.Поэтому вместо этого я попытался удалить все поля слияния в .dotx и добавить их снова.Это сработало, но оно нашло бы только одно поле слияния (как SimpleField), в частности, последнее, добавленное перед сохранением .dotx.Рассматривая шаблон с помощью инструмента повышения производительности Open XML, я вижу, что все остальные поля слияния имеют тип w: instrText, поэтому их игнорируют.

Я буквально только начинаю с OpenXML какмы собираемся заменить нашу нынешнюю автоматизацию офиса этим, поэтому я очень мало знаю на данный момент.Может кто-нибудь, пожалуйста, проинструктировать меня немного дальше или указать мне хороший ресурс?У меня Google немного, но я не могу найти свою конкретную проблему.Я пытаюсь отложить чтение всей документации SDK (я знаю, я знаю!), Так как мне нужно быстро собрать решение, поэтому я концентрируюсь на одной задаче - взять наши существующие шаблоны .dot, преобразовать их в.dotx и просто замените поля слияния данными для получения .docx.

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Работа с OpenXml - вам не нужно строго использовать .dotx для ваших шаблонов, вместо этого вы можете создавать свои шаблоны, просто используя DocX прямо сейчас.Хороший ресурс изучения OpenXML - это, очевидно, http://openxmldeveloper.org/, и вы можете найти здесь хорошее pdf .

Также стоит взглянуть на сторонний API docx.codeplex.com, который я сейчас использую для разработки серверного решения для автоматизации документооборота для моей компании.См. Пример http://cathalscorner.blogspot.co.uk/2009/08/docx-v1007-released.html, который похож на ваш сценарий .. объединение полей с данными .. Надеюсь, это поможет ..

2 голосов
/ 07 марта 2013

Вот ссылка на «Пример завершения слияния в C # OpenXML» http://www.jarredcapellman.com/2012/10/22/c-openxml-mail-merge-complete-example/

Я использовал его для обновления кода моего веб-приложения, используемого для работы с полями слияния в файлах .DOC (.DOT) (итребуется установить MS Word и настроить соответствующий DCOM на веб-сервере).Теперь для решения требуется, чтобы на веб-сервере была установлена ​​только OpenXML SDK 2.0, а шаблоны .DOC (.DOT) были сохранены как .DOCX (.DOTX).

0 голосов
/ 23 марта 2012

Если вы хотите использовать элементы управления контентом, вы также можете попробовать WordDocumentGenerator.WordDocumentGenerator - это утилита для генерации документов Word из шаблонов с использованием Visual Studio 2010 и Open XML 2.0 SDK @ http://worddocgenerator.codeplex.com

...