2015-09-11 1 views
0

Nous avons un docx MailMerge qui a le tableau suivant:MailMerge TaleStart-TableFin: Ajouter Entrée sur la fin de la page avec des lignes multilignes

_____________________________________________________________________________ 
Date   Id  Description        Amount 
_____________________________________________________________________________ 
{{TableStart {{Id}} {{Description}}       € {{Amount 
:Lines}}{{Da              \# 0,00}}{{ 
te \@"dd-MM-              TableEnd:Li 
yyyy"}}               nes}} 
_____________________________________________________________________________ 
                 Total € {{Total \# 
                   0,00}} 
_____________________________________________________________________________ 

est ici une ligne de résultat exemple:

____________________________________________________________________________ 
Date   Id  Description        Amount 
____________________________________________________________________________ 
03-09-2015 0001  Company Name        € 25,00 
         Buyer Name 1, Buyer Name 2 
         Product description 
         Extra description line 

Comme vous pouvez voir, la description a plusieurs lignes. Lorsque la fin d'une page est atteinte, elle continue à la page suivante. Donc, avec l'exemple ci-dessus, la ligne pourrait être comme celui-ci à la fin de la page 1:

03-09-2015 0001  Company Name        € 25,00 
         Buyer Name 1, Buyer Name 2 

Et comme ça au début de la page 2:

     Product description 
         Extra description line 

Ce que je voudrais plutôt est ce qui suit: Lorsqu'un article ne rentre plus sur la page, l'article entier doit aller au début de la page suivante. Fondamentalement, je veux empêcher les articles de se diviser entre les pages. Existe-t-il un moyen d'accomplir cela avec MailMerge?

En outre, nous utilisons C# dans notre projet. Voici le code que nous utilisons pour MailMerge. Je pense qu'il est un peu trop ambitieux de se demander s'il existe un paramètre pour autoriser le comportement que je désire dans les bibliothèques MailMerge. Quoi qu'il en soit, voici le code que nous utilisons pour convertir les données & docx à un pdf:

var pdf = _documentService.CreateTableFile(new TableFileData(date, companyId, 
    dataList.Select(x => new TableRowData 
    { 
     Description = x.Description, 
     Amount = x.Amount, 
     Date = x.Date, 
     Id = x.Id 
    }).ToList())); 

var path = Path.Combine(FileService.GetTemporaryPath(), Path.GetRandomFileName()); 
var file = Path.ChangeExtension(path, "pdf"); 

using (var fs = File.OpenWrite(file)) 
{ 
    fs.Write(pdf, 0, pdf.Length); 
} 

Process.Start(file); 

Avec CreateTableFile méthode:

public byte[] CreateTableFile(TableFileData data) 
{ 
    if (data == null) throw new ArgumentNullException("data"); 

    const string fileName = "TableFile.docx"; 
    var path = Path.Combine(_templatePath, fileName); 

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

Avec GenerateDocument méthode:

private static byte[] GenerateDocument(Stream template, DocumentDataSource dataSource, 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()) 
    { 
     var options = new PdfSaveOptions { WarningCallback = new AsposeWarningCallback() }; 
     doc.Save(ms, options); 
     return ms.ToArray(); 
    } 
} 
+1

Il semble que vous utilisiez une fonctionnalité de fusion tierce, pas la fusion intégrée. Mais vous ne savez pas si c'est un problème de programmation, * si * vous pouvez le résoudre en sélectionnant la ligne du tableau dans votre document principal de publipostage et en décochant la case "Autoriser la ligne à traverser les pages" (dans l'onglet Ligne du Boîte de dialogue Propriétés du tableau). Peut encore être un problème de veuve/orphelin où la rangée de titre est sur une page et la rangée de données finit la prochaine. –

+0

@bibadia Merci beaucoup, cela a fait l'affaire. J'ai vérifié l'option sur dans les paramètres de la table dans le fichier .docx, et cela fonctionne. Pourriez-vous accepter une réponse, ou voulez-vous que je vous réponde? –

+0

Voulez-vous créer la réponse? (Je n'ai pas d'étapes détaillées à portée de main, par exemple). –

Répondre

0

Après @ suggestion de bibadia dans le premier commentaire de la question, j'ai décoché la case à cocher suggéré des paramètres de la table dans le docx: enter image description here

Cela a fait l'affaire, merci beaucoup bibadia!