Сливане на документи
Това Aspose.Words Document Merger за .NET ви позволява програмно да обединявате произволен брой Word‑compatible документи в единен изход, като запазвате форматирането, стиловете, оформлението на страницата, горните/долните колонтитули и полетата. Типични приложения включват съставяне на отчети, групиране на приложени към договори документи или събиране на генерирано съдържание за архивиране.
Работи без графичен интерфейс в Windows, Linux и macOS. Не е необходим Microsoft Office.
Инсталиране и настройка
- Инсталирайте NuGet пакета
Aspose.Words. - Прилагайте измервателно лицензиране при стартиране на приложението, за да избегнете водни знаци от оценъчната версия. Вижте Измервателно лицензиране .
- Проверете изискванията за рамката в Ръководство за инсталиране .
IDE-та: Visual Studio 2017–2026, JetBrains Rider, MonoDevelop.
Поддържани входове / изходи: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, and Word 2007 XML.
Бърз старт: Прибавяне на множество документи
using Aspose.Words;
var master = new Document();
var builder = new DocumentBuilder(master);
builder.InsertBreak(BreakType.SectionBreakNewPage);
ImportFormatMode mode = ImportFormatMode.KeepSourceFormatting;
foreach (string path in new[] { "Blank.docx", "Background images.docx", "annex.rtf" })
{
var src = new Document(path);
master.AppendDocument(src, mode);
builder.MoveToDocumentEnd();
builder.InsertBreak(BreakType.SectionBreakNewPage);
}
master.UpdateFields();
master.Save("MergedOutput.docx");Режими за импорт на формати:
- KeepSourceFormatting — запазва стиловете и директното форматиране на всеки източник (идеално за брандирани вмъквания).
- UseDestinationStyles — съпоставя идентични имена на стилове с дефинициите на дестинацията за еднороден вид.
Контролиран раздел и оформление на страницата
Започнете всеки документ на Нова страница, Продължително, или Четна/нечетна страница:
var sect = master.LastSection;
sect.PageSetup.SectionStart = SectionStart.NewPage; // Continuous, EvenPage, OddPageУеднаквяване на маржовете/размера на страницата чрез копиране PageSetup от секция от шаблон:
using Aspose.Words;
var master = new Document();
var template = new Document("template.docx");
var pageSetup = template.FirstSection.PageSetup;
foreach (Section s in master.Sections)
{
s.PageSetup.Orientation = pageSetup.Orientation;
s.PageSetup.PageWidth = pageSetup.PageWidth;
s.PageSetup.PageHeight = pageSetup.PageHeight;
s.PageSetup.TopMargin = pageSetup.TopMargin;
s.PageSetup.BottomMargin = pageSetup.BottomMargin;
s.PageSetup.LeftMargin = pageSetup.LeftMargin;
s.PageSetup.RightMargin = pageSetup.RightMargin;
}Горни колонтитули, долни колонтитули и водни знаци
Запазете оригиналните горни/долни колонтитули или ги заменете с главен набор след обединяването:
// Copy headers/footers from a master template into every section
var hft = new Document("header-footer-template.docx");
foreach (Section s in master.Sections)
{
s.HeadersFooters.Clear();
s.HeadersFooters.AddClone(hft.FirstSection.HeadersFooters[HeaderFooterType.HeaderPrimary]);
s.HeadersFooters.AddClone(hft.FirstSection.HeadersFooters[HeaderFooterType.FooterPrimary]);
}
// Add a simple text watermark
foreach (Section s in master.Sections)
{
var header = s.HeadersFooters[HeaderFooterType.HeaderPrimary] ?? new HeaderFooter(master, HeaderFooterType.HeaderPrimary);
if (header.ParentNode == null) s.HeadersFooters.Add(header);
var shape = new Shape(master, ShapeType.TextPlainText)
{
RelativeHorizontalPosition = RelativeHorizontalPosition.Page,
RelativeVerticalPosition = RelativeVerticalPosition.Page,
WrapType = WrapType.None,
Rotation = -40,
Width = 400, Height = 100, Left = 100, Top = 200,
BehindText = true
};
shape.TextPath.Text = "CONFIDENTIAL";
header.AppendChild(shape);
}Полета, кръстосани препратки и TOC
След обединяване, актуализирайте полетата, за да се обновят номерата на страниците, препратките и Съдържание съответствайте на новото оформление:
master.UpdateFields();
master.UpdatePageLayout(); // ensures accurate page count
master.UpdateTableLayout(); // improves complex table paginationАко поддържате един главен TOC, вмъкнете го еднократно и оставете автоматичното му обновяване:
using Aspose.Words;
var master = new Document();
var b = new DocumentBuilder(master);
b.MoveToDocumentStart();
b.InsertTableOfContents("TOC \\$1 \\$1 \\$1 \\$1"); // classic TOC switch set
master.UpdateFields();Сливане тип Stream‑First / голям обем
using System.IO;
using System.Collections.Generic;
using Aspose.Words;
using Aspose.Words.Lists;
IEnumerable<Stream> sourceStreams = new List<Stream>();
using (var output = new MemoryStream())
{
var dst = new Document();
foreach (Stream srcStream in sourceStreams)
{
using var s = srcStream; // e.g., S3/Blob stream
var src = new Document(s); // auto‑detects format
dst.AppendDocument(src, ImportFormatMode.UseDestinationStyles);
}
dst.UpdateFields();
dst.Save(output, SaveFormat.docx);
output.Position = 0;
// return/output stream
}Съвети за производителност:
- Пакетни добавяния в паметта; извикайте
UpdateFields()веднъж в края. - Предпочитайте UseDestinationStyles когато искате последователно стилизиране на десетки входове.
- Освобождаване
Documentинстанции в началото на дълги конвейери, за да се намали пиковата памет.
Най-добри практики
- Предвалидация за корупция/пароли, за да се избегнат частични сливания.
- Изберете KeepSourceFormatting когато е важно запазването на марката; изберете UseDestinationStyles за еднороден вид.
- Вмъкнете раздел преди всяко добавяне, за да защитите настройките на страницата.
- Уеднаквяване на заглавки/долни колонтитули след добавяне, ако искате единен корпоративен шаблон.
- Обновете полетата и съдържанието като последна стъпка.
- При много големи партиди, разделете ги на групи и слейте групите, за да поддържате стабилна памет.
FAQ
- Мога ли да принудя всеки източник да започва на нова страница? Да. Вмъкнете раздел или прекъсване на страница преди всеки
AppendDocumentизвикване или задаванеSectionStartдоNewPage. - Как да запазя стиловете на дестинацията при импортиране? Използвайте
ImportFormatMode.UseDestinationStylesвAppendDocument. - Ще се актуализират ли номерата на страниците и съдържанието автоматично? Извикайте
UpdateFields()(иUpdatePageLayout()за точно пагиниране) след всички добавяния. - Необходим ли е Office? Не. Aspose.Words е самостоятелна библиотека.