2012-03-18 86 views

回答

8

看一看Fourth and Final Screen-Cast in Series on Adding/Updating the TOC in OpenXML WordprocessingML Documents由埃里克·怀特。

希望有帮助!

UPDATE:


According FAQ从MSDN论坛我看到不支持此功能:

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

Open XML SDK 2.0不支持此功能。但您可以通过Word应用程序生成 小TOC,并在Open XML SDK生产力工具中反映TOC部件与文档 Reflector组件,以了解如何以编程方式生成TOC 。 有关详细信息,请 参考:


更新2


基于我们的评论下面我会建议使用这样的情景:

  1. 您可以手动创建一个空的DOCX文件,插入TOC在里面。
  2. 然后你保存这个文件并在OpenXML SDK 2.0工具中打开它,它提供了C#代码来生成这样一个空文件,里面有TOC占位符。
  3. 然后,您以编程方式刷新所需的所有数据到此DOCX文件并保存。
  4. 此外,您需要提供一种数据刷新(或打开文档后)自动更新TOC的机制。有几个选项可以做到这一点 - 请参阅我上面提供的Eric White发布的链接的屏幕投射3-5。尤其是,我认为您应该注意5th one - “”展示如何在任何包含TOC的文档打开时使用AutoOpen宏更新TOC“。

所有这些看起来有点棘手,但我希望有所帮助。

+0

谢谢,但链接已损坏。是[this](http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2011/08/22/exploring-tables-of-contents-in-openxml-wordprocessingml-documents-part-4.aspx) ? – Yeseanul 2012-03-19 14:36:09

+0

我有固定的链接。而且 - 是的 - 就像在openxmldeveloper.org上发布的一样...经过一番调查后,我调整了一些新的细节 – 2012-03-19 15:42:10

+0

感谢您的回复。我也读过大多数与MSDN相关的内容,但我不知道如何实现这个解决方案。而且,似乎没有人提供过一个例子。毕竟,TOC是一个文档的重要组成部分......我认为它以某种方式被OpenXML SDK所覆盖(或者至少有人已经找到了一个易于使用的解决方案)。 – Yeseanul 2012-03-19 15:53:31

3

感谢Dmitri Pavlov(@DmitryPavlov)的帮助。

我不想回答我自己的问题,但这只是为了说明我已采取的步骤。

对任何有兴趣的人的建议是观看埃里克·怀特的5部电影 - Exploring Tables-of-Contents in Open XML WordprocessingML Documents。这有关于添加和更新TOC(更多)的所有信息。

我的解决方案是使用一个模板(只是一个普通的空文档,它具有我需要的所有东西样式:标题1-5,TOC样式等)。这对于样式问题的快速修复特别有用(具有TOC的新文档将创建一个新的style.xml;该文件具有一些附加数据;因此TOC中的层次结构不是预期的 - 即,标题2是标题1的孩子,标题3是标题2的孩子等)。

因此:

  1. 创建的Word文档,并添加所有您希望稍后编程添加的元件(例如,报头1-5,目录,等等)。删除所有内容并保存文档(原因是为所有必要的元素创建样式)。

  2. 我亲自添加了模板(在第1步创建的文件)作为我的项目中的资源。

  3. 在您的代码中,创建模板的新副本(这将是您将使用的实际文件)。我用过:

    byte[] stream = Properties.Resources.Template; 
    File.WriteAllBytes(@"D:\Template.docx", stream); 
    File.Copy(@"D:\Template.docx", @"D:\New.docx"); 
    
  4. 将所有的数据冲洗到这个文件。

  5. 从屏幕投2中,3或4的源文件添加到您的项目(此请参阅屏幕播3) - 在那些帖子的末尾,你会发现一个链接,下载TocAdder.zip 。或者只是添加一个参考TocAdder.dll

  6. 插入TOC。举个例子:

    using (WordprocessingDocument wdoc = WordprocessingDocument.Open(@"D:\New.docx", true)) 
    { 
        XElement firstPara = wdoc 
         .MainDocumentPart 
         .GetXDocument() 
         .Descendants(W.p) 
         .FirstOrDefault(); 
        TocAdder.AddToc(wdoc, firstPara, 
         @"TOC \o '1-3' \h \z \u", null, null); 
    } 
    
  7. 将新创建的文档中的样式替换为模板中的样式。您可以从MSDN使用此资源:Replacing the Styles Parts in Word 2010 Documents by Using the Open XML SDK 2.0。再次,一个例子:

    string fromDoc = @"D:\Template.docx"; 
    string toDoc = @"D:\New.docx"; 
    var node = WDExtractStyles(fromDoc, false); 
    if (node != null) 
        WDReplaceStyles(toDoc, node, false); 
    node = WDExtractStyles(fromDoc); 
    if (node != null) 
        WDReplaceStyles(toDoc, node); 
    
  8. 任选地使用的在屏幕铸3,4或5,以获得解决该问题与该字搭设模式对话框描述的方法之一。

希望这对别人有用。

+0

当您使用流而不是文件时,是否也可以删除模态对话框?因为我使用memorystream生成文档,然后将其提供给用户进行下载。现在他们必须单击yes来更新目录,因为我找不到避免这种模式对话框的方法。 – 2014-08-04 14:18:57