2015-10-30 9 views
2

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

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

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

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

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

Мне не удалось найти много о MailMerge вообще, если честно, и ничего о foreach в MS Word-doc.

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

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

и

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

EDIT:

Мы используем Aspose.Words (.MailMerge & .MailMerging) для этого преобразования из нашего Data-объекта данных в документ 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)); 
    } 
} 
+0

Я никогда не видел этот синтаксис раньше. Является ли это встроенной функцией или надстройкой? –

+0

@lc. Это функция «MailMerge» библиотеки 'Aspose.Words', которая преобразует данные. Я редактировал свой вопрос, чтобы показать пример того, как word-doc преобразуется с нашими данными. –

ответ

0

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

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

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

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

Тело тега, как правило, состоит из следующих элементов:

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

< < tag_name [выражение] -switch1 -switch2 ... >>

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

< </TAG_NAME >>

Примечание - Элементы Тэг тела чувствительны к регистру.

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

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 в качестве разработчика-евангелиста.