C# 合并docx文件后,标题1、标题2不会在文档的样式区中高亮显示

C# 合并docx文件后,标题1、标题2不会在文档的样式区中高亮显示,c#,openxml,wordml,C#,Openxml,Wordml,我正在合并一些docx文件,这些文件是通过C#使用openxml和wordml创建的。标题标签为标题1、标题2等的文件,以及带有这些标签的文本。当单独创建这些文件时,如果我们单击或选择标有标题1和标题2的文本,则标题1、标题2等将高亮显示,并且导航栏也会针对标题1、标题2标记显示,但在合并这些文档后,当我们单击或选择这些文本时,标题1和标题2不会突出显示。在“样式”功能区中。这里给出了合并的代码 MemoryStream ms = new MemoryStream();

我正在合并一些docx文件,这些文件是通过C#使用openxml和wordml创建的。标题标签为标题1、标题2等的文件,以及带有这些标签的文本。当单独创建这些文件时,如果我们单击或选择标有标题1和标题2的文本,则标题1、标题2等将高亮显示,并且导航栏也会针对标题1、标题2标记显示,但在合并这些文档后,当我们单击或选择这些文本时,标题1和标题2不会突出显示。在“样式”功能区中。这里给出了合并的代码

        MemoryStream ms = new MemoryStream();

        using (WordprocessingDocument myDoc =
WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
            mainPart.Document = new Document { Body = new Body() };
            int counter = 1;
            foreach (var sectionOutput in sectionOutputs)
            {
                foreach (var outputFile in sectionOutput.Files)
                {
                    Paragraph sectionBreakPara = null;
                    if (!sectionOutput.SectionType.Equals(sectionOutputs[sectionOutputs.Count - 1].SectionType))
                    {
                        if (outputFile == sectionOutput.Files.Last())
                        //check whether this is the last file in this section
                        {
                            using (
                                WordprocessingDocument pkgSourceDoc =
                                    WordprocessingDocument.Open(outputFile.OutputStream, true))
                            {
                                var sourceBody = pkgSourceDoc.MainDocumentPart.Document.Body;

                                SectionProperties docSectionBreak =
                                    sourceBody.Descendants<SectionProperties>().LastOrDefault();
                                if (docSectionBreak != null)
                                {
                                    var clonedSectionBreak = (SectionProperties)docSectionBreak.CloneNode(true);
                                    clonedSectionBreak.RemoveAllChildren<FooterReference>();
                                    clonedSectionBreak.RemoveAllChildren<HeaderReference>();
                                    sectionBreakPara = new Paragraph();
                                    ParagraphProperties sectionParaProp = new ParagraphProperties();
                                    sectionParaProp.AppendChild(clonedSectionBreak);
                                    sectionBreakPara.AppendChild(sectionParaProp);
                                }
                            }
                        }
                    }

                    string altChunkId = string.Format("altchunkId{0}", counter);
                    AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
                        AlternativeFormatImportPartType.WordprocessingML, altChunkId);
                    outputFile.OutputStream.Seek(0, SeekOrigin.Begin);

                    chunk.FeedData(outputFile.OutputStream);
                    AltChunk altChunk = new AltChunk(new AltChunkProperties(new MatchSource { Val = new OnOffValue(true) })) { Id = altChunkId };

                    mainPart.Document.Body.AppendChild(altChunk);

                    if (sectionBreakPara != null)
                    {
                        mainPart.Document
                           .Body
                           .AppendChild(sectionBreakPara);
                    }

                    counter++;
                }
            }


            mainPart.Document.Save();
        }

        return ms;
MemoryStream ms=newmemoryStream();
使用(WordProcessingDocumentMyDoc=
创建(ms,WordprocessingDocumentType.Document))
{
MainDocumentPart mainPart=myDoc.AddMainDocumentPart();
mainPart.Document=新文档{Body=newbody()};
int计数器=1;
foreach(sectionOutputs中的var sectionOutput)
{
foreach(sectionOutput.Files中的var outputFile)
{
段落段落段落=空;
如果(!sectionOutput.SectionType.Equals(sectionOutputs[sectionOutputs.Count-1].SectionType))
{
if(outputFile==sectionOutput.Files.Last())
//检查这是否是本节中的最后一个文件
{
使用(
WordprocessingDocument pkgSourceDoc=
WordprocessingDocument.Open(outputFile.OutputStream,true))
{
var sourceBody=pkgSourceDoc.MainDocumentPart.Document.Body;
SectionProperties docSectionBreak=
sourceBody.subjects().LastOrDefault();
如果(docSectionBreak!=null)
{
var clonedSectionBreak=(SectionProperties)docSectionBreak.CloneNode(true);
clonedSectionBreak.RemoveAllChildren();
clonedSectionBreak.RemoveAllChildren();
sectionBreakPara=新段落();
ParagraphProperties sectionParaProp=新的ParagraphProperties();
SectionParrop.AppendChild(clonedSectionBreak);
sectionBreakPara.AppendChild(sectionParaProp);
}
}
}
}
string altChunkId=string.Format(“altChunkId{0}”,计数器);
AlternativeFormatImportPart chunk=mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.WordprocessingML,altChunkId);
outputFile.OutputStream.Seek(0,SeekOrigin.Begin);
chunk.FeedData(outputFile.OutputStream);
AltChunk AltChunk=new AltChunk(新的AltChunkProperties(新的MatchSource{Val=new OnOffValue(true)})){Id=altChunkId};
mainPart.Document.Body.AppendChild(altChunk);
如果(sectionBreakPara!=null)
{
主要部分.文件
.身体
.儿童(第6段);
}
计数器++;
}
}
mainPart.Document.Save();
}
返回ms;

通常,当style.xml部分中不存在样式定义时,会出现此症状。如果在合并过程中,文档内容被保留,但样式部分没有保留,则可能会导致此问题

在一个新的Word文档中,只有极少数基本样式,如普通样式。在将样式定义(如标题1)指定给段落之前,不会将该样式定义添加到styles.xml中。当段落元素包含包中不存在的样式的样式指定时,将忽略该样式

它也可能出现在表格单元格中,其中表格设置覆盖样式。例如,在表格中,您可以说第一行(如标题)应以特定的字体和颜色显示,这将覆盖样式设置


如果两者都不起作用,如果你在其中一个段落及其直接上下文周围发布少量生成的XML,这可能会提供一些线索。

两个不同的源文件的标题1的样式是否不同?不,两个不同的源文件的标题1的样式没有不同。嗨,scanny,感谢您的建议,style.xml包含Heading1和Heading2样式,实际上在单个文档中没有这样的问题,Heading1和Heading2会在其中突出显示,但在合并文档后会出现此问题。那么,如果您已经添加了两种可能的响应方式,您能对此提出一些建议吗?您好Scanny,感谢您的建议,问题现在已经解决了,我们在合并不同部分时添加了style.xml,并且在OnOffValue中传递了假值,语法是AltChunk AltChunk=new AltChunk(new AltChunkProperties)(new MatchSource{Val=new-OnOffValue(false)}}{Id=altChunkId};很高兴听到它工作了:)如果你觉得这个答案对你有帮助,别忘了接受它。