如何在没有 altchunk 的情况下将 docx 文档插入到另一个 docx 的特定位置
How to insert a docx document into another docx at certain position without altchunk
有没有办法在不使用 altchunk 的情况下将整个 docx 文档插入到另一个文档中?问题是插入后我必须使用来自 OpenXml Powertools 的 DocumentBuilder 将生成的文档与另一个文档合并,它不支持包含 altchunks 的文档。
好的,所以我想出了一个解决方案。为了在特定位置插入文档,我将原始文档拆分为 DocumentBuilder 的两个来源,然后我从要插入的文档中创建了一个来源。最后,我用这 3 个源构建了一个新文档,它似乎工作得很好。
我正在寻找用占位符拆分原始文档的段落,例如“@@insert@@”。
下面是代码,如果有人需要的话。
var paragraph = DestinationDocument.MainDocumentPart.Document.Descendants<OpenXmlParagraph>().FirstOrDefault(item => item.InnerText.Contains(placeHolder));
if (paragraph != null)
{
var idOfParagraph =
DestinationDocument.MainDocumentPart.Document.Descendants<OpenXmlParagraph>()
.ToList()
.IndexOf(paragraph);
//save and close current destination document
SaveChanges(destinationFilePath, false);
var sources = new List<Source>();
var originalDocument = new WmlDocument(destinationFilePath);
sources.Add(new Source(originalDocument, 0, idOfParagraph, true)); // add first part of initial document
var documentToBeInserted = new WmlDocument(docFilePath);
sources.Add(new Source(documentToBeInserted, true)); // add document to be inserted
sources.Add(new Source(originalDocument, idOfParagraph + 1, true)); // add rest of initial document
var newDestinationDocument = DocumentBuilder.BuildDocument(sources); // build new document
newDestinationDocument.SaveAs(destinationFilePath); // save
// re-open destination document
DestinationDocument = WordprocessingDocument.Open(Path.GetFullPath(destinationFilePath), true);
}
有没有办法在不使用 altchunk 的情况下将整个 docx 文档插入到另一个文档中?问题是插入后我必须使用来自 OpenXml Powertools 的 DocumentBuilder 将生成的文档与另一个文档合并,它不支持包含 altchunks 的文档。
好的,所以我想出了一个解决方案。为了在特定位置插入文档,我将原始文档拆分为 DocumentBuilder 的两个来源,然后我从要插入的文档中创建了一个来源。最后,我用这 3 个源构建了一个新文档,它似乎工作得很好。
我正在寻找用占位符拆分原始文档的段落,例如“@@insert@@”。
下面是代码,如果有人需要的话。
var paragraph = DestinationDocument.MainDocumentPart.Document.Descendants<OpenXmlParagraph>().FirstOrDefault(item => item.InnerText.Contains(placeHolder));
if (paragraph != null)
{
var idOfParagraph =
DestinationDocument.MainDocumentPart.Document.Descendants<OpenXmlParagraph>()
.ToList()
.IndexOf(paragraph);
//save and close current destination document
SaveChanges(destinationFilePath, false);
var sources = new List<Source>();
var originalDocument = new WmlDocument(destinationFilePath);
sources.Add(new Source(originalDocument, 0, idOfParagraph, true)); // add first part of initial document
var documentToBeInserted = new WmlDocument(docFilePath);
sources.Add(new Source(documentToBeInserted, true)); // add document to be inserted
sources.Add(new Source(originalDocument, idOfParagraph + 1, true)); // add rest of initial document
var newDestinationDocument = DocumentBuilder.BuildDocument(sources); // build new document
newDestinationDocument.SaveAs(destinationFilePath); // save
// re-open destination document
DestinationDocument = WordprocessingDocument.Open(Path.GetFullPath(destinationFilePath), true);
}