Yes*_*nul 10 .net openxml openxml-sdk
使用SDK我正在构建包含报告的Word文档.这些文件需要有TOC.有没有人有一个完整的解决方案,我可以遵循,以了解如何做到这一点?
(我已经阅读了http://openxmldeveloper.org/上的所有内容)
看看由Eric White 在OpenXML WordprocessingML文档中添加/更新TOC的系列中的第四个和最后一个屏幕.
希望有所帮助!
更新:
8)如何在Word文档中生成TOC(目录)?
Open XML SDK 2.0不支持此功能.但是您可以通过Word应用程序生成一个小TOC,并在Open XML SDK Productivity Tool中使用Document Reflector组件反映TOC部分,以了解如何以编程方式生成TOC.有关更多详细信息,请参阅:
更新2
根据我们下面的评论,我可以建议使用这种情况:
所有这一切看起来有点棘手,但我希望有所帮助.
使用自动目录(可点击)
设置标题
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)从空文档生成目录,你可以使用这个:
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)
" }
创建 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)设置 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 文件,它工作正常!