MailMerge #foreach список строк с использованием Aspose.Words

В настоящее время я создаю файл MailMerge и хочу показать список строк. В прошлом я использовал список объектов (например, Customer) и мог иметь что-то вроде этого в документе Word:

{{ #foreach Customers }}
{{Name}}
{{Address}}
{{ /foreach Customers }}

Однако теперь у меня есть список strings вместо объектов, и я просто хочу их показать:

{{ #foreach List }}
{{???}}
{{ /foreach List }}

Итак, что должно идти на ???. Или мне следует изменить #foreach List на что-то вроде foreach в .NET C#, то есть {{ #foreach value in List }} или что-то подобное?

Честно говоря, мне не удалось найти много о MailMerge в целом, и ничего о foreach в документе MS Word.

Если это невозможно, я думаю, мне придется поместить строку в контейнерный класс? Нравиться:

public class StringContainer
{
    public string String { get; set; }
}

и

{{ #foreach List }}
{{String}}
{{ /foreach List}}

РЕДАКТИРОВАТЬ:

Мы используем Aspose.Words (.MailMerge и .MailMerging) для этого преобразования из нашего объекта данных в данные в документе MS Word. Вот код для конвертации:

private static byte[] GenerateDocument(Stream template, DocumentDataSource dataSource, SaveOptions saveOptions, IFieldMergingCallback fieldMergingCallback = null)
{
    var doc = new Document(template);

    doc.MailMerge.FieldMergingCallback = fieldMergingCallback;
    doc.MailMerge.UseNonMergeFields = true;
    doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveContainingFields |
                                   MailMergeCleanupOptions.RemoveUnusedFields |
                                   MailMergeCleanupOptions.RemoveUnusedRegions |
                                   MailMergeCleanupOptions.RemoveEmptyParagraphs;

    doc.MailMerge.Execute(dataSource);
    doc.MailMerge.ExecuteWithRegions((IMailMergeDataSourceRoot)dataSource);

    doc.UpdateFields();

    using (var ms = new MemoryStream())
    {
        doc.Save(ms, saveOptions);
        return ms.ToArray();
    }
}

А вот пример того, как мы его используем:

public byte[] CreateLetter(string filePath, string fileName, OurDataObject data)
{
    var path = Path.Combine(filePath, fileName);

    using (var fs = File.OpenRead(path))
    {
        var dataSource = new DocumentDataSource(data);
        return GenerateDocument(fs, dataSource, new OoxmlSaveOptions(SaveFormat.Docx));
    }
}

person Kevin Cruijssen    schedule 30.10.2015    source источник
comment
Я никогда раньше не видел такого синтаксиса. Это встроенная функция или дополнение?   -  person lc.    schedule 30.10.2015
comment
@лк. Это функция MailMerge библиотеки Aspose.Words, которая преобразует данные. Я отредактировал свой вопрос, чтобы показать пример того, как word-doc преобразуется с нашими данными.   -  person Kevin Cruijssen    schedule 30.10.2015


Ответы (1)


Я предлагаю вам использовать подсистему отчетов Aspose.Words LINQ для достижения ваших требований.

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

Тело тега должно соответствовать следующим требованиям:

  • Тело тега должно быть окружено последовательностями символов «‹‹» и «>>».
  • Тело тега должно содержать только текстовые узлы.
  • Тело тега не должно располагаться внутри узлов документа разметки, таких как StructuredDocumentTag, CustomXmlMarkup или SmartTag.

Тело тега обычно состоит из следующих элементов:

  • Имя тега
  • Выражение, заключенное в скобки
  • Набор переключателей, доступных для тега, каждому из которых предшествует символ «-».

‹‹ имя_тега [выражение] –switch1 –switch2 ... >>

Отдельные теги могут иметь дополнительные элементы. Некоторые теги требуют закрывающих аналогов. Закрывающий тег имеет символ «/», который предшествует его имени. Имя этого тега должно совпадать с именем соответствующего открывающего тега.

‹‹ /tag_name >>

Примечание. В элементах тела тега учитывается регистр.

Прочтите эту ссылку и проверьте следующий пример кода . Надеюсь, это поможет вам.

DocumentBuilder builder = new DocumentBuilder();
builder.Write("The items are: <<foreach [item in items]>><<[item]>>, <</foreach>>and others.");
Document doc = builder.Document;

ReportingEngine engine = new ReportingEngine();
engine.BuildReport(doc, new string[] { "Item1", "Item2", "Item3" }, "items");

doc.Save(MyDir + "out.docx");

Я работаю с Aspose в качестве евангелиста разработчиков.

person Tahir Manzoor    schedule 02.11.2015