如何使用OpenXML SDK 2.0生成目录?

Yes*_*nul 10 .net openxml openxml-sdk

使用SDK我正在构建包含报告的Word文档.这些文件需要有TOC.有没有人有一个完整的解决方案,我可以遵循,以了解如何做到这一点?

(我已经阅读了http://openxmldeveloper.org/上的所有内容)

Dmi*_*lov 9

看看由Eric White 在OpenXML WordprocessingML文档中添加/更新TOC的系列中的第四个和最后一个屏幕.

希望有所帮助!

更新:


根据 MSDN论坛的常见问题我发现不支持此功能:

8)如何在Word文档中生成TOC(目录)?

Open XML SDK 2.0不支持此功能.但是您可以通过Word应用程序生成一个小TOC,并在Open XML SDK Productivity Tool中使用Document Reflector组件反映TOC部分,以了解如何以编程方式生成TOC.有关更多详细信息,请参阅:


更新2


根据我们下面的评论,我可以建议使用这种情况:

  1. 您手动创建一个空的DOCX文件并在其中插入TOC.
  2. 然后保存此文件并在OpenXML SDK 2.0 Tool中打开它,它提供了C#代码,用于生成包含TOC占位符的空文件.
  3. 然后,您以编程方式刷新此DOCX文件所需的所有数据并保存.
  4. 此外,您需要提供一旦刷新数据(或打开文档后)将自动更新TOC的机制.有几个选项可以做到这一点 - 请参阅上面提供的Eric White帖子链接中的屏幕转换3-5.特别是,我认为你应该注意第五个 - " 显示当打开任何包含TOC的文档时如何使用AutoOpen宏来更新TOC ".

所有这一切看起来有点棘手,但我希望有所帮助.


exp*_*tro 6

使用自动目录(可点击)

  1. 设置标题

    public static Paragraph SetHeading1(this Paragraph p)
    {
        var pPr = p.Descendants<ParagraphProperties>().First();
        pPr.ParagraphStyleId = new ParagraphStyleId() { Val = "Heading1" };
        return p;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从空文档生成目录,你可以使用这个:

    private static string GetTOC(string title, int titleFontSize)
    {
        return $@"<w:sdt>
     <w:sdtPr>
        <w:id w:val=""-493258456"" />
        <w:docPartObj>
           <w:docPartGallery w:val=""Table of Contents"" />
           <w:docPartUnique />
        </w:docPartObj>
     </w:sdtPr>
     <w:sdtEndPr>
        <w:rPr>
           <w:rFonts w:asciiTheme=""minorHAnsi"" w:eastAsiaTheme=""minorHAnsi"" w:hAnsiTheme=""minorHAnsi"" w:cstheme=""minorBidi"" />
           <w:b />
           <w:bCs />
           <w:noProof />
           <w:color w:val=""auto"" />
           <w:sz w:val=""22"" />
           <w:szCs w:val=""22"" />
        </w:rPr>
     </w:sdtEndPr>
     <w:sdtContent>
        <w:p w:rsidR=""00095C65"" w:rsidRDefault=""00095C65"">
           <w:pPr>
              <w:pStyle w:val=""TOCHeading"" />
              <w:jc w:val=""center"" /> 
           </w:pPr>
           <w:r>
                <w:rPr>
                  <w:b /> 
                  <w:color w:val=""2E74B5"" w:themeColor=""accent1"" w:themeShade=""BF"" /> 
                  <w:sz w:val=""{titleFontSize * 2}"" /> 
                  <w:szCs w:val=""{titleFontSize * 2}"" /> 
              </w:rPr>
              <w:t>{title}</w:t>
           </w:r>
        </w:p>
        <w:p w:rsidR=""00095C65"" w:rsidRDefault=""00095C65"">
           <w:r>
              <w:rPr>
                 <w:b />
                 <w:bCs />
                 <w:noProof />
              </w:rPr>
              <w:fldChar w:fldCharType=""begin"" />
           </w:r>
           <w:r>
              <w:rPr>
                 <w:b />
                 <w:bCs />
                 <w:noProof />
              </w:rPr>
              <w:instrText xml:space=""preserve""> TOC \o ""1-3"" \h \z \u </w:instrText>
           </w:r>
           <w:r>
              <w:rPr>
                 <w:b />
                 <w:bCs />
                 <w:noProof />
              </w:rPr>
              <w:fldChar w:fldCharType=""separate"" />
           </w:r>
           <w:r>
              <w:rPr>
                 <w:noProof />
              </w:rPr>
              <w:t>No table of contents entries found.</w:t>
           </w:r>
           <w:r>
              <w:rPr>
                 <w:b />
                 <w:bCs />
                 <w:noProof />
              </w:rPr>
              <w:fldChar w:fldCharType=""end"" />
           </w:r>
        </w:p>
     </w:sdtContent>
    
    Run Code Online (Sandbox Code Playgroud)

    " }

  3. 创建 SdtBlock,并设置 TOC xml

        var sdtBlock = new SdtBlock();
        sdtBlock.InnerXml = GetTOC(Translations.ResultsBooksTableOfContentsTitle, 16);
        document.MainDocumentPart.Document.Body.AppendChild(sdtBlock);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 设置 UpdateFieldsOnOpen

        var settingsPart = document.MainDocumentPart.AddNewPart<DocumentSettingsPart>();
        settingsPart.Settings = new Settings { BordersDoNotSurroundFooter = new BordersDoNotSurroundFooter() { Val = true } };
    
        settingsPart.Settings.Append(new UpdateFieldsOnOpen() { Val = true });
    
    Run Code Online (Sandbox Code Playgroud)

如果您需要从 docx 生成 pdf 文件,它工作正常!

  • 奇迹般有效。修复了代码块,因为它遗漏了几个标签 (2认同)