2015-10-30 1 views
2

Je crée actuellement un fichier MailMerge et je souhaite afficher une liste de chaînes. Dans le passé, je l'ai utilisé une liste d'objets (par exemple Customer) et a été en mesure d'avoir quelque chose comme ça dans la Parole-doc:MailMerge #foreach liste de chaînes utilisant Aspose.Words

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

Maintenant, cependant, j'ai une liste de strings au lieu d'objets, et je veux simplement leur montrer:

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

Alors, ce qui est censé aller au ???. Ou devrais-je changer le #foreach List pour quelque chose comme un foreach dans .NET C#, c'est-à-dire {{ #foreach value in List }} ou quelque chose de similaire?

Je n'ai pas été en mesure de trouver beaucoup de choses sur MailMerge en général pour être honnête, et rien à propos de foreach dans le MS Word-doc.

Si ce n'est pas possible, je suppose que je vais devoir mettre la chaîne dans une classe-conteneur? Comme:

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

et

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

EDIT:

Nous utilisons Aspose.Words (.MailMerge & .MailMerging) pour cette conversion de nos données objet de données dans le MS Word doc. Voici le code pour la conversion:

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(); 
    } 
} 

Et voici un exemple de la façon dont nous utilisons:

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

Je n'ai jamais vu cette syntaxe auparavant. Est-ce une fonctionnalité intégrée ou un add-on? –

+0

@lc. C'est la fonction 'MailMerge' de la bibliothèque' Aspose.Words' qui convertit les données. J'ai édité ma question pour montrer un exemple de la façon dont le document-doc est converti avec nos données. –

Répondre

0

Je vous suggère d'utiliser s'il vous plaît Aspose.Words LINQ Reporting Engine pour atteindre vos besoins.

Un modèle type pour LINQ Reporting Engine est composé de contenus de document communs et de balises qui décrivent la structure et les liaisons de données du modèle. Vous pouvez créer ces balises en utilisant simplement du texte qui peut occuper plusieurs paragraphes pour être plus descriptif.

Un corps de l'étiquette doit satisfaire aux exigences suivantes:

  • Un corps de l'étiquette doit être entouré par « < < » et « >> » séquences de caractères.
  • Un corps de balise doit contenir uniquement des nœuds de texte.
  • Un corps de balise ne doit pas être situé à l'intérieur des nœuds de document de balisage, tels que StructuredDocumentTag, CustomXmlMarkup ou SmartTag.

Un corps d'étiquette comprend généralement les éléments suivants:

  • un nom d'étiquette
  • Une expression entouré par des crochets
  • Un ensemble de commutateurs disponibles pour l'étiquette, qui est précédé chacun des par le caractère « - »

< < nom_tiquette [expression] -switch1 -switch2 ... >>

Les étiquettes peuvent contenir des éléments supplémentaires. Certaines étiquettes nécessitent des contreparties de fermeture. Une balise fermante a le caractère "/" qui précède son nom. Le nom de cette étiquette doit correspondre au nom de la balise d'ouverture correspondante.

< </tag_name >>

Remarque - éléments du corps Tag sont sensibles à la casse.

Veuillez lire le lien this et vérifier l'exemple de code suivant. J'espère que cela vous aide.

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"); 

Je travaille avec Aspose comme développeur évangéliste.