【问题标题】:Office Word intertop heading styles not showing in table of contentsOffice Word 顶部标题样式未显示在目录中
【发布时间】:2014-11-18 05:11:31
【问题描述】:

我正在使用 Office 的 Word 互操作构建一个 Word 文档。我正在通过代码设置标题样式。内容的样式正确,但是,打开创建的 word 文档时,没有为标题中的选择选择样式。这导致目录找不到标题。

object oMissing = Missing.Value;

//Start Word and create a new document.
var application = new Application();
application.Visible = true;
var document = application.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);

foreach (var member in assembly.Members)
{
    //Insert a paragraph at the beginning of the document
    var paragraph = document.Content.Paragraphs.Add(ref oMissing);
    paragraph.set_Style(WdBuiltinStyle.wdStyleHeading1);
    paragraph.Range.Text = member.MemberName;
    paragraph.Range.InsertParagraphAfter();
}

document.TablesOfContents.Add(document.Content, true /*use heading styles*/, oMissing, oMissing, oMissing,
                                                    oMissing, oMissing, oMissing, oMissing, oMissing,
                                                    oMissing, oMissing);

document.SaveAs(@"C:\test.docx", oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
document.Close();
application.Quit();

此示例导致目录显示“未找到条目”。

请注意,内容的样式与标题样式正确。但是,当我手动打开文档并选择“标题 1”时,目录会正确找到条目。

任何想法为什么会发生这种情况?我是带有内置样式名称的 callign set_Style。为什么它应用样式但实际上并未被视为样式(在本例中为标题)?

更新

添加以下代码似乎只使第一个标题被识别为 Word 中的标题。

    foreach (var member in assembly.Members)
    {
        document.ActiveWindow.Selection.set_Style(WdBuiltinStyle.wdStyleHeading1);
        //Insert a paragraph at the beginning of the document
        var paragraph = document.Content.Paragraphs.Add(ref oMissing);
        paragraph.set_Style(WdBuiltinStyle.wdStyleHeading1);
        paragraph.Range.Text = member.MemberName;
        paragraph.Range.InsertParagraphAfter();
    }

【问题讨论】:

    标签: c# ms-word office-interop


    【解决方案1】:

    我注意到操作顺序的不同

    以下代码不会生成真正的标题,它只是看起来像标题

    /*1*/ paragraph.set_Style(WdBuiltinStyle.wdStyleHeading1);
    /*2*/ paragraph.Range.Text = "Head";
    /*3*/ paragraph.Range.InsertParagraphAfter();
    

    要解决问题,您应该使用此代码

    /*1*/ paragraph.Range.Text = "Head";
    /*2*/ paragraph.set_Style(WdBuiltinStyle.wdStyleHeading1);
    /*3*/ paragraph.Range.InsertParagraphAfter();
    

    【讨论】:

    • 这仍然不起作用。它仍然只是看起来像它
    【解决方案2】:

    添加段落后,选择它可能工作的段落。

    paragraph.Range().Select()
    

    【讨论】:

      【解决方案3】:

      我不得不做类似的事情,但段落没有得到风格......

      我使用 TypeText 代替,然后工作......我也使用了 Word.Selection。我正在合并文档,但我猜你的代码应该是这样的:

      (行后: var document = application.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing))。我在 usings 上使用 Word = Microsoft.Office.Interop.Word,这样选择之前的“Word”。

      Word.Selection selection = application.Selection;
      
      foreach (var member in assembly.Members)
      {
        selection.TypeText(member.MerberName);
        selection.set_Style(WdBuiltinStyle.wdStyleHeading1);
        selection.TypeParagraph();
      }
      

      这在这里有效,并且 TOC 正在被填满。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-17
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        相关资源
        最近更新 更多