MailMerge TaleStart-TableEnd: Добавете enter в края на страницата с многоредови редове

Имаме MailMerge docx, който има следната таблица:

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

Ето примерен ред с резултати:

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

Както можете да видите, описанието има няколко реда. Когато се стигне до края на страница, тя просто продължава на следващата страница. Така че с примера по-горе редът може да бъде така в края на страница 1:

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

И така в началото на страница 2:

                       Product description
                       Extra description line

Вместо това бих искал следното: когато даден елемент вече не се побира на страницата, целият елемент трябва да отиде в началото на следващата страница. По принцип искам да предотвратя разделянето на елементи между страниците. Има ли някакъв начин да се постигне това с MailMerge?

Освен това използваме C# в нашия проект. Ето кода, който използваме за MailMerge. Мисля, че е малко амбициозно да питам дали има настройка, позволяваща желаното от мен поведение в библиотеките на MailMerge. Както и да е, ето кода, който използваме, за да конвертираме данните и docx в 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);

С CreateTableFile метод:

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

С GenerateDocument-метод:

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

person Kevin Cruijssen    schedule 11.09.2015    source източник
comment
Изглежда, че използвате възможност за сливане на трета страна, а не вграденото сливане. Но не съм сигурен, че това всъщност е програмен проблем, ако можете да го разрешите, като изберете реда на таблицата в основния си документ за циркулярни документи и махнете отметката от квадратчето Разрешаване на разделяне на реда между страниците (той е в реда раздел на диалоговия прозорец Свойства на таблицата). Все още може да е проблем с вдовица/сирак, когато заглавният ред е на една страница, а редът с данни завършва на следващата.   -  person    schedule 12.09.2015
comment
@bibadia Благодаря много, това свърши работа. Проверих опцията в настройките на таблицата в .docx и тя работи. Имате ли нещо против да дадете отговор, който мога да приема, или искате аз да отговоря вместо вас?   -  person Kevin Cruijssen    schedule 14.09.2015
comment
Бихте ли създали отговора? (Нямам подробни стъпки, например).   -  person    schedule 14.09.2015
comment
@bibadia Създадох отговора. Още веднъж благодаря за поправката.   -  person Kevin Cruijssen    schedule 14.09.2015


Отговори (1)


След предложението на @bibadia в първия коментар на въпроса, премахнах отметката от предложеното квадратче за отметка на настройките на таблицата в docx: въведете описание на изображението тук

Това свърши работа, така че благодаря много bibadia!

person Kevin Cruijssen    schedule 14.09.2015