使用SDK我正在构建包含报告的Word文档。这些文件需要有TOC。 有没有人有完整的解决方案,我可以按照以了解如何做到这一点?如何使用OpenXML SDK 2.0生成目录?
(我在http://openxmldeveloper.org/读到的一切)
使用SDK我正在构建包含报告的Word文档。这些文件需要有TOC。 有没有人有完整的解决方案,我可以按照以了解如何做到这一点?如何使用OpenXML SDK 2.0生成目录?
(我在http://openxmldeveloper.org/读到的一切)
希望有帮助!
UPDATE:
According FAQ从MSDN论坛我看到不支持此功能:
8)如何生成Word文档中的TOC(目录)?
Open XML SDK 2.0不支持此功能。但您可以通过Word应用程序生成 小TOC,并在Open XML SDK生产力工具中反映TOC部件与文档 Reflector组件,以了解如何以编程方式生成TOC 。 有关详细信息,请 参考:
更新2
基于我们的评论下面我会建议使用这样的情景:
所有这些看起来有点棘手,但我希望有所帮助。
感谢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的孩子等)。
因此:
创建的Word文档,并添加所有您希望稍后编程添加的元件(例如,报头1-5,目录,等等)。删除所有内容并保存文档(原因是为所有必要的元素创建样式)。
我亲自添加了模板(在第1步创建的文件)作为我的项目中的资源。
在您的代码中,创建模板的新副本(这将是您将使用的实际文件)。我用过:
byte[] stream = Properties.Resources.Template;
File.WriteAllBytes(@"D:\Template.docx", stream);
File.Copy(@"D:\Template.docx", @"D:\New.docx");
将所有的数据冲洗到这个文件。
从屏幕投2中,3或4的源文件添加到您的项目(此请参阅屏幕播3) - 在那些帖子的末尾,你会发现一个链接,下载TocAdder.zip 。或者只是添加一个参考TocAdder.dll。
插入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);
}
将新创建的文档中的样式替换为模板中的样式。您可以从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);
任选地使用的在屏幕铸3,4或5,以获得解决该问题与该字搭设模式对话框描述的方法之一。
希望这对别人有用。
当您使用流而不是文件时,是否也可以删除模态对话框?因为我使用memorystream生成文档,然后将其提供给用户进行下载。现在他们必须单击yes来更新目录,因为我找不到避免这种模式对话框的方法。 – 2014-08-04 14:18:57
谢谢,但链接已损坏。是[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
我有固定的链接。而且 - 是的 - 就像在openxmldeveloper.org上发布的一样...经过一番调查后,我调整了一些新的细节 – 2012-03-19 15:42:10
感谢您的回复。我也读过大多数与MSDN相关的内容,但我不知道如何实现这个解决方案。而且,似乎没有人提供过一个例子。毕竟,TOC是一个文档的重要组成部分......我认为它以某种方式被OpenXML SDK所覆盖(或者至少有人已经找到了一个易于使用的解决方案)。 – Yeseanul 2012-03-19 15:53:31