Как программно создать серийное письмо Word и сохранить его как единый документ?

Как можно сгенерировать серийное письмо docx в приложении ASP.NET MVC? Я могу заполнить простой шаблон docx данными из БД, используя docx с элементами управления содержимым и библиотекой OpenXML - как предлагается, например, здесь.

Однако при попытке использовать это для последовательного письма и слияния сгенерированных документов в один выходной docx (подсказка здесь), полученное последовательное письмо содержит данные первой записи - например, когда я создавал письмо для 10 сотрудников и вводил эти данные, в результате получилось 10 писем, но все с данными первого сотрудника.

Изменить: (добавлен пример кода)

internal static Stream CreateMultiPartDocument(IList<object> data, string templatePath)
{
    Stream mainDocumentStream = CreateTempDocument(data[0], templatePath);            

    for(int i = 1; i < data.Count; i++)
    {
        object childDocumentData = data[i];
        Stream childDocumentStream = CreateTempDocument(childDocumentData, templatePath);

        AppendChildDocument(mainDocumentStream, childDocumentStream);
    }

    mainDocumentStream.Flush();
    mainDocumentStream.Position = 0;

    return mainDocumentStream;
}


internal static Stream CreateTempDocument(object data, string templatePath)
{
    string fullTemplatePath = Path.Combine(TEMPLATE_BASE_PATH, templatePath);
    FileStream templateFile = File.Open(fullTemplatePath, FileMode.Open);

    if(null != templateFile)
    {                
        MemoryStream fileInMemory = new MemoryStream();
        templateFile.CopyTo(fileInMemory);

        string customXML = data.SerializeToXml();

        ReplaceCustomXmlInMemory(fileInMemory, customXML);
        fileInMemory.Flush();
        fileInMemory.Position = 0;

        templateFile.Close();
        return fileInMemory;
    }

    return null;
}

private static void ReplaceCustomXmlInMemory(MemoryStream fileInMemory, string customXML)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(fileInMemory, true))
    {
        MainDocumentPart mainPart = wordDoc.MainDocumentPart;
        mainPart.DeleteParts(mainPart.CustomXmlParts);
        CustomXmlPart customXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
        using (StreamWriter streamWriter = new StreamWriter(customXmlPart.GetStream()))
        {
            streamWriter.Write(customXML);
        }

        wordDoc.Close();
    }
}

person gurbi    schedule 22.11.2016    source источник
comment
Если вы написали для этого какой-то код, но не можете заставить его работать, значит, вы попали в нужное место: просто добавьте свой код (или соответствующие части) в вопрос. Без этого мы не можем помочь. См. stackoverflow.com/help/how-to-ask   -  person Peter B    schedule 22.11.2016


Ответы (1)


Единственное решение, которое мне удалось найти, - это переключиться с OpenXml на библиотеку Syncfusion FileFormats - они поддерживают функцию слияния почты с нуля, с возможностью ввода нескольких форматов. См. Ссылку здесь. Он доступен также в виде пакета Nuget, так что это было очень просто.

person gurbi    schedule 23.11.2016