标题1,标题2在合并docx文件后未在文档的样式功能区中突出显示

时间:2014-07-07 14:02:13

标签: c# openxml wordml

我正在合并几个docx文件,这些文件是使用openxml和wordml通过C#创建的。具有标题标记为标题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;

1 个答案:

答案 0 :(得分:1)

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

在新的Word文档中,只有很少的基本样式,例如Normal。在将样式指定给段落之前,样式定义1之类的样式定义不会添加到styles.xml中。当段落元素包含包中不存在的样式的样式分配时,将忽略该样式。

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

如果这些都不起作用,如果你发布了一小部分生成的XML,就在其中一个段落及其直接上下文中,这可能会给出一些线索。