Мы имеем в MailMerge DOCX, который имеет следующую таблицу:MailMerge TaleStart-TableEnd: Добавить вписывают в конце страницы с многострочными строками
_____________________________________________________________________________
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();
}
}
Похоже, что вы используете стороннюю возможность слияния, а не встроенное слияние. Но не уверен, что это на самом деле проблема программирования, * если * вы можете решить ее, выбрав строку таблицы в основном документе слияния и сняв флажок «Разрешить строку для разбивки на страницы» (это на вкладке «Строка» Диалоговое окно «Свойства таблицы»). По-прежнему может быть проблемой вдова/сирота, где строка заголовка находится на одной странице, а строка данных заканчивается на следующем. –
@bibadia Большое спасибо, это сделал трюк. Я проверил параметр в настройках таблицы в .docx, и он работает. Не могли бы вы принять ответ, который я могу принять, или вы хотите, чтобы я дал вам ответ? –
Вы бы создали ответ? (Например, у меня нет каких-либо подробных шагов). –